diff --git a/include/proto/applet.h b/include/proto/applet.h index 62612b554..b4e9396e0 100644 --- a/include/proto/applet.h +++ b/include/proto/applet.h @@ -25,12 +25,13 @@ #include #include +#include #include #include -#include #include extern unsigned int nb_applets; +extern struct pool_head *pool_head_appctx; struct task *task_run_applet(struct task *t, void *context, unsigned short state); @@ -56,21 +57,20 @@ static inline void appctx_init(struct appctx *appctx, unsigned long thread_mask) /* Tries to allocate a new appctx and initialize its main fields. The appctx * is returned on success, NULL on failure. The appctx must be released using - * pool_free(connection) or appctx_free(), since it's allocated from the - * connection pool. is assigned as the applet, but it can be NULL. + * appctx_free(). is assigned as the applet, but it can be NULL. */ static inline struct appctx *appctx_new(struct applet *applet, unsigned long thread_mask) { struct appctx *appctx; - appctx = pool_alloc(pool_head_connection); + appctx = pool_alloc(pool_head_appctx); if (likely(appctx != NULL)) { appctx->obj_type = OBJ_TYPE_APPCTX; appctx->applet = applet; appctx_init(appctx, thread_mask); appctx->t = task_new(thread_mask); if (unlikely(appctx->t == NULL)) { - pool_free(pool_head_connection, appctx); + pool_free(pool_head_appctx, appctx); return NULL; } appctx->t->process = task_run_applet; @@ -83,9 +83,7 @@ static inline struct appctx *appctx_new(struct applet *applet, unsigned long thr return appctx; } -/* Releases an appctx previously allocated by appctx_new(). Note that - * we share the connection pool. - */ +/* Releases an appctx previously allocated by appctx_new(). */ static inline void __appctx_free(struct appctx *appctx) { task_destroy(appctx->t); @@ -96,7 +94,7 @@ static inline void __appctx_free(struct appctx *appctx) HA_SPIN_UNLOCK(BUF_WQ_LOCK, &buffer_wq_lock); } - pool_free(pool_head_connection, appctx); + pool_free(pool_head_appctx, appctx); _HA_ATOMIC_SUB(&nb_applets, 1); } diff --git a/include/proto/stream_interface.h b/include/proto/stream_interface.h index 63f1738bc..6727921eb 100644 --- a/include/proto/stream_interface.h +++ b/include/proto/stream_interface.h @@ -188,7 +188,7 @@ static inline void si_release_endpoint(struct stream_interface *si) else if ((appctx = objt_appctx(si->end))) { if (appctx->applet->release && !si_state_in(si->state, SI_SB_DIS|SI_SB_CLO)) appctx->applet->release(appctx); - appctx_free(appctx); /* we share the connection pool */ + appctx_free(appctx); } else if ((conn = objt_conn(si->end))) { conn_stop_tracking(conn); conn_full_close(conn); diff --git a/src/applet.c b/src/applet.c index 4832a748f..f6cc08809 100644 --- a/src/applet.c +++ b/src/applet.c @@ -23,6 +23,8 @@ unsigned int nb_applets = 0; +DECLARE_POOL(pool_head_appctx, "appctx", sizeof(struct appctx)); + /* 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 * stream interface. In this case the buffer is immediately allocated and the