From: Willy Tarreau Date: Tue, 10 May 2022 07:04:18 +0000 (+0200) Subject: MINOR: conn_stream: add a pointer back to the cs from the endpoint X-Git-Tag: v2.6-dev10~23 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=efb4618c6ea17547a5f755c12c41ee7476228bcc;p=thirdparty%2Fhaproxy.git MINOR: conn_stream: add a pointer back to the cs from the endpoint Muxes and applets need to have both a pointer to the endpoint and to the conn_stream. It would seem more natural that they only have a pointer to the endpoint (that is always there) and that this one has an optional pointer to the conn_stream. This would reduce the number of elements to manipulate in lower level code. In addition, the conn_stream is not much used from the lower layers (wake and exceptional events mostly). --- diff --git a/include/haproxy/conn_stream-t.h b/include/haproxy/conn_stream-t.h index d746d6e268..6701107e45 100644 --- a/include/haproxy/conn_stream-t.h +++ b/include/haproxy/conn_stream-t.h @@ -158,11 +158,13 @@ struct data_cb { * * is the mux or the appctx * is the context set and used by + * is the conn_stream we're attached to, or NULL * CS_EP_* */ struct cs_endpoint { void *target; void *ctx; + struct conn_stream *cs; unsigned int flags; }; diff --git a/src/conn_stream.c b/src/conn_stream.c index b5147905b3..5fda0d893c 100644 --- a/src/conn_stream.c +++ b/src/conn_stream.c @@ -86,6 +86,7 @@ void cs_endpoint_init(struct cs_endpoint *endp) { endp->target = NULL; endp->ctx = NULL; + endp->cs = NULL; endp->flags = CS_EP_NONE; } @@ -112,7 +113,7 @@ void cs_endpoint_free(struct cs_endpoint *endp) /* Tries to allocate a new conn_stream and initialize its main fields. On * failure, nothing is allocated and NULL is returned. It is an internal - * function. The caller must, at least, set the CS_EP_ORPHAN or CS_EP_DETAC§HED + * function. The caller must, at least, set the CS_EP_ORPHAN or CS_EP_DETACHED * flag. */ static struct conn_stream *cs_new(struct cs_endpoint *endp) @@ -142,6 +143,7 @@ static struct conn_stream *cs_new(struct cs_endpoint *endp) goto alloc_error; } cs->endp = endp; + endp->cs = cs; return cs; @@ -364,9 +366,10 @@ static void cs_detach_endp(struct conn_stream **csp) if (conn->mux) { /* TODO: handle unsubscribe for healthchecks too */ - cs->endp->flags |= CS_EP_ORPHAN; if (cs->wait_event.events != 0) conn->mux->unsubscribe(cs, cs->wait_event.events, &cs->wait_event); + cs->endp->flags |= CS_EP_ORPHAN; + cs->endp->cs = NULL; conn->mux->detach(cs); cs->endp = NULL; } @@ -384,8 +387,9 @@ static void cs_detach_endp(struct conn_stream **csp) else if (cs->endp->flags & CS_EP_T_APPLET) { struct appctx *appctx = __cs_appctx(cs); - cs->endp->flags |= CS_EP_ORPHAN; cs_applet_shut(cs); + cs->endp->flags |= CS_EP_ORPHAN; + cs->endp->cs = NULL; appctx_free(appctx); cs->endp = NULL; } @@ -478,6 +482,7 @@ int cs_reset_endp(struct conn_stream *cs) cs_detach_endp(&cs); BUG_ON(cs->endp); cs->endp = new_endp; + cs->endp->cs = cs; cs->endp->flags |= CS_EP_DETACHED; return 0; }