From: Willy Tarreau Date: Tue, 19 May 2020 15:07:30 +0000 (+0200) Subject: MINOR: applet: adopt the wait list entry from the CLI X-Git-Tag: v2.2-dev8~32 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=9597cbd17a984852395ce7337ca245b7f9c84ac1;p=thirdparty%2Fhaproxy.git MINOR: applet: adopt the wait list entry from the CLI A few fields, including a generic list entry, were added to the CLI context by commit 300decc8d9 ("MINOR: cli: extend the CLI context with a list and two offsets"). It turns out that the list entry (l0) is solely used to consult rings and that the generic ring_write() code is restricted to a consumer on the CLI due to this, which was not the initial intent. Let's make it a general purpose wait_entry field that is properly initialized during appctx_init(). This will allow any applet to wait on a ring, not just the CLI. --- diff --git a/include/proto/applet.h b/include/proto/applet.h index 31b4d90252..14fbca2a12 100644 --- a/include/proto/applet.h +++ b/include/proto/applet.h @@ -53,6 +53,7 @@ static inline void appctx_init(struct appctx *appctx, unsigned long thread_mask) appctx->call_rate.curr_ctr = 0; appctx->call_rate.prev_ctr = 0; appctx->state = 0; + LIST_INIT(&appctx->wait_entry); } /* Tries to allocate a new appctx and initialize its main fields. The appctx diff --git a/include/types/applet.h b/include/types/applet.h index b990726f7c..013c5023d1 100644 --- a/include/types/applet.h +++ b/include/types/applet.h @@ -73,6 +73,7 @@ struct appctx { unsigned long thread_mask; /* mask of thread IDs authorized to process the applet */ struct task *t; /* task associated to the applet */ struct freq_ctr call_rate; /* appctx call rate */ + struct list wait_entry; /* entry in a list of waiters for an event (e.g. ring events) */ union { struct { @@ -105,7 +106,6 @@ struct appctx { const char *msg; /* pointer to a persistent message to be returned in CLI_ST_PRINT state */ int severity; /* severity of the message to be returned according to (syslog) rfc5424 */ char *err; /* pointer to a 'must free' message to be returned in CLI_ST_PRINT_FREE state */ - struct list l0; /* General purpose list element, pointers, offsets and integers for... */ void *p0, *p1, *p2; /* ...registered commands, initialized to 0 by the CLI before first... */ size_t o0, o1; /* ...invocation of the keyword parser, except for the list element which... */ int i0, i1; /* ...is initialized with LIST_INIT(). */ diff --git a/src/cli.c b/src/cli.c index af17811041..a083ae7f6a 100644 --- a/src/cli.c +++ b/src/cli.c @@ -500,7 +500,6 @@ static int cli_parse_request(struct appctx *appctx) appctx->st2 = 0; memset(&appctx->ctx.cli, 0, sizeof(appctx->ctx.cli)); - LIST_INIT(&appctx->ctx.cli.l0); p = appctx->chunk->area; end = p + appctx->chunk->data; diff --git a/src/ring.c b/src/ring.c index ec0656fbcf..48003b38bc 100644 --- a/src/ring.c +++ b/src/ring.c @@ -191,7 +191,7 @@ ssize_t ring_write(struct ring *ring, size_t maxlen, const struct ist pfx[], siz sent = lenlen + totlen + 1; /* notify potential readers */ - list_for_each_entry(appctx, &ring->waiters, ctx.cli.l0) + list_for_each_entry(appctx, &ring->waiters, wait_entry) appctx_wakeup(appctx); done_buf: @@ -249,7 +249,7 @@ int cli_io_handler_show_ring(struct appctx *appctx) return 1; HA_RWLOCK_WRLOCK(LOGSRV_LOCK, &ring->lock); - LIST_DEL_INIT(&appctx->ctx.cli.l0); + LIST_DEL_INIT(&appctx->wait_entry); HA_RWLOCK_WRUNLOCK(LOGSRV_LOCK, &ring->lock); HA_RWLOCK_RDLOCK(LOGSRV_LOCK, &ring->lock); @@ -324,7 +324,7 @@ int cli_io_handler_show_ring(struct appctx *appctx) if (!si_oc(si)->output && !(si_oc(si)->flags & CF_SHUTW)) { /* let's be woken up once new data arrive */ HA_RWLOCK_WRLOCK(LOGSRV_LOCK, &ring->lock); - LIST_ADDQ(&ring->waiters, &appctx->ctx.cli.l0); + LIST_ADDQ(&ring->waiters, &appctx->wait_entry); HA_RWLOCK_WRUNLOCK(LOGSRV_LOCK, &ring->lock); si_rx_endp_done(si); ret = 0; @@ -349,7 +349,7 @@ void cli_io_release_show_ring(struct appctx *appctx) /* reader was still attached */ ofs -= ring->ofs; BUG_ON(ofs >= b_size(&ring->buf)); - LIST_DEL_INIT(&appctx->ctx.cli.l0); + LIST_DEL_INIT(&appctx->wait_entry); HA_ATOMIC_SUB(b_peek(&ring->buf, ofs), 1); } HA_ATOMIC_SUB(&ring->readers_count, 1);