diff --git a/include/haproxy/applet.h b/include/haproxy/applet.h index f646a0544..fdfc1ee02 100644 --- a/include/haproxy/applet.h +++ b/include/haproxy/applet.h @@ -37,6 +37,7 @@ extern struct pool_head *pool_head_appctx; 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 9149af443..35fd8e1a2 100644 --- a/src/applet.c +++ b/src/applet.c @@ -93,6 +93,20 @@ void *applet_reserve_svcctx(struct appctx *appctx, size_t size) 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 * 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 819f2cb4a..ff8704f5f 100644 --- a/src/conn_stream.c +++ b/src/conn_stream.c @@ -388,11 +388,11 @@ 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_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 @@ struct appctx *cs_applet_create(struct conn_stream *cs, struct applet *app) 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 @@ static void cs_app_shutr_applet(struct conn_stream *cs) 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 @@ static void cs_app_shutw_applet(struct conn_stream *cs) 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: