]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: conn_stream: add a pointer back to the cs from the endpoint
authorWilly Tarreau <w@1wt.eu>
Tue, 10 May 2022 07:04:18 +0000 (09:04 +0200)
committerWilly Tarreau <w@1wt.eu>
Fri, 13 May 2022 12:28:48 +0000 (14:28 +0200)
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).

include/haproxy/conn_stream-t.h
src/conn_stream.c

index d746d6e268decd1ccc4b7bb9e4e36b79d4961e4c..6701107e457cc0ccb3b5779584696cba6c7f861d 100644 (file)
@@ -158,11 +158,13 @@ struct data_cb {
  *
  * <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;
 };
 
index b5147905b36affcfa6d519d8367ac3c53bbdc728..5fda0d893ca242c291d48be1109c9c7f4f7c4fbc 100644 (file)
@@ -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;
 }