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 d746d6e..6701107 100644
--- a/include/haproxy/conn_stream-t.h
+++ b/include/haproxy/conn_stream-t.h
@@ -158,11 +158,13 @@
*
* <target> is the mux or the appctx
* <ctx> is the context set and used by <target>
+ * <cs> is the conn_stream we're attached to, or NULL
* <flags> 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 b514790..5fda0d8 100644
--- a/src/conn_stream.c
+++ b/src/conn_stream.c
@@ -86,6 +86,7 @@
{
endp->target = NULL;
endp->ctx = NULL;
+ endp->cs = NULL;
endp->flags = CS_EP_NONE;
}
@@ -112,7 +113,7 @@
/* 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 @@
goto alloc_error;
}
cs->endp = endp;
+ endp->cs = cs;
return cs;
@@ -364,9 +366,10 @@
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 @@
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 @@
cs_detach_endp(&cs);
BUG_ON(cs->endp);
cs->endp = new_endp;
+ cs->endp->cs = cs;
cs->endp->flags |= CS_EP_DETACHED;
return 0;
}