MINOR: applet: replace cs_applet_shut() with appctx_shut()
The former takes a conn_stream still attached to a valid appctx,
which also complicates the termination of the applet. Instead, let's
pass the appctx which already points to the endpoint, this allows us
to properly detach the conn_stream before the call, which is cleaner
and safer.
diff --git a/include/haproxy/applet.h b/include/haproxy/applet.h
index f646a05..fdfc1ee 100644
--- a/include/haproxy/applet.h
+++ b/include/haproxy/applet.h
@@ -37,6 +37,7 @@
struct task *task_run_applet(struct task *t, void *context, unsigned int state);
int appctx_buf_available(void *arg);
void *applet_reserve_svcctx(struct appctx *appctx, size_t size);
+void appctx_shut(struct appctx *appctx);
struct appctx *appctx_new(struct applet *applet, struct cs_endpoint *endp);
diff --git a/src/applet.c b/src/applet.c
index 9149af4..35fd8e1 100644
--- a/src/applet.c
+++ b/src/applet.c
@@ -93,6 +93,20 @@
return appctx->svcctx;
}
+/* call the applet's release() function if any, and marks the endp as shut.
+ * Needs to be called upon close().
+ */
+void appctx_shut(struct appctx *appctx)
+{
+ if (appctx->endp->flags & (CS_EP_SHR|CS_EP_SHW))
+ return;
+
+ if (appctx->applet->release)
+ appctx->applet->release(appctx);
+
+ appctx->endp->flags |= CS_EP_SHRR | CS_EP_SHWN;
+}
+
/* Callback used to wake up an applet when a buffer is available. The applet
* <appctx> is woken up if an input buffer was requested for the associated
* conn-stream. In this case the buffer is immediately allocated and the
diff --git a/src/conn_stream.c b/src/conn_stream.c
index 819f2cb..ff8704f 100644
--- a/src/conn_stream.c
+++ b/src/conn_stream.c
@@ -388,11 +388,11 @@
else if (cs->endp->flags & CS_EP_T_APPLET) {
struct appctx *appctx = __cs_appctx(cs);
- cs_applet_shut(cs);
cs->endp->flags |= CS_EP_ORPHAN;
cs->endp->cs = NULL;
- appctx_free(appctx);
cs->endp = NULL;
+ appctx_shut(appctx);
+ appctx_free(appctx);
}
if (cs->endp) {
@@ -514,20 +514,6 @@
return appctx;
}
-/* call the applet's release function if any. Needs to be called upon close() */
-void cs_applet_shut(struct conn_stream *cs)
-{
- struct appctx *appctx = __cs_appctx(cs);
-
- if (cs->endp->flags & (CS_EP_SHR|CS_EP_SHW))
- return;
-
- if (appctx->applet->release)
- appctx->applet->release(appctx);
-
- cs->endp->flags |= CS_EP_SHRR | CS_EP_SHWN;
-}
-
/*
* This function performs a shutdown-read on a detached conn-stream in a
* connected or init state (it does nothing for other states). It either shuts
@@ -922,7 +908,7 @@
return;
if (cs_oc(cs)->flags & CF_SHUTW) {
- cs_applet_shut(cs);
+ appctx_shut(__cs_appctx(cs));
cs->state = CS_ST_DIS;
__cs_strm(cs)->conn_exp = TICK_ETERNITY;
}
@@ -980,7 +966,7 @@
case CS_ST_QUE:
case CS_ST_TAR:
/* Note that none of these states may happen with applets */
- cs_applet_shut(cs);
+ appctx_shut(__cs_appctx(cs));
cs->state = CS_ST_DIS;
/* fall through */
default: