mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-11-29 23:01:03 +01:00
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.
This commit is contained in:
parent
223ddedb46
commit
9597cbd17a
@ -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.curr_ctr = 0;
|
||||||
appctx->call_rate.prev_ctr = 0;
|
appctx->call_rate.prev_ctr = 0;
|
||||||
appctx->state = 0;
|
appctx->state = 0;
|
||||||
|
LIST_INIT(&appctx->wait_entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Tries to allocate a new appctx and initialize its main fields. The appctx
|
/* Tries to allocate a new appctx and initialize its main fields. The appctx
|
||||||
|
|||||||
@ -73,6 +73,7 @@ struct appctx {
|
|||||||
unsigned long thread_mask; /* mask of thread IDs authorized to process the applet */
|
unsigned long thread_mask; /* mask of thread IDs authorized to process the applet */
|
||||||
struct task *t; /* task associated to the applet */
|
struct task *t; /* task associated to the applet */
|
||||||
struct freq_ctr call_rate; /* appctx call rate */
|
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 {
|
union {
|
||||||
struct {
|
struct {
|
||||||
@ -105,7 +106,6 @@ struct appctx {
|
|||||||
const char *msg; /* pointer to a persistent message to be returned in CLI_ST_PRINT state */
|
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 */
|
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 */
|
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... */
|
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... */
|
size_t o0, o1; /* ...invocation of the keyword parser, except for the list element which... */
|
||||||
int i0, i1; /* ...is initialized with LIST_INIT(). */
|
int i0, i1; /* ...is initialized with LIST_INIT(). */
|
||||||
|
|||||||
@ -500,7 +500,6 @@ static int cli_parse_request(struct appctx *appctx)
|
|||||||
|
|
||||||
appctx->st2 = 0;
|
appctx->st2 = 0;
|
||||||
memset(&appctx->ctx.cli, 0, sizeof(appctx->ctx.cli));
|
memset(&appctx->ctx.cli, 0, sizeof(appctx->ctx.cli));
|
||||||
LIST_INIT(&appctx->ctx.cli.l0);
|
|
||||||
|
|
||||||
p = appctx->chunk->area;
|
p = appctx->chunk->area;
|
||||||
end = p + appctx->chunk->data;
|
end = p + appctx->chunk->data;
|
||||||
|
|||||||
@ -191,7 +191,7 @@ ssize_t ring_write(struct ring *ring, size_t maxlen, const struct ist pfx[], siz
|
|||||||
sent = lenlen + totlen + 1;
|
sent = lenlen + totlen + 1;
|
||||||
|
|
||||||
/* notify potential readers */
|
/* 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);
|
appctx_wakeup(appctx);
|
||||||
|
|
||||||
done_buf:
|
done_buf:
|
||||||
@ -249,7 +249,7 @@ int cli_io_handler_show_ring(struct appctx *appctx)
|
|||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
HA_RWLOCK_WRLOCK(LOGSRV_LOCK, &ring->lock);
|
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_WRUNLOCK(LOGSRV_LOCK, &ring->lock);
|
||||||
|
|
||||||
HA_RWLOCK_RDLOCK(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)) {
|
if (!si_oc(si)->output && !(si_oc(si)->flags & CF_SHUTW)) {
|
||||||
/* let's be woken up once new data arrive */
|
/* let's be woken up once new data arrive */
|
||||||
HA_RWLOCK_WRLOCK(LOGSRV_LOCK, &ring->lock);
|
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);
|
HA_RWLOCK_WRUNLOCK(LOGSRV_LOCK, &ring->lock);
|
||||||
si_rx_endp_done(si);
|
si_rx_endp_done(si);
|
||||||
ret = 0;
|
ret = 0;
|
||||||
@ -349,7 +349,7 @@ void cli_io_release_show_ring(struct appctx *appctx)
|
|||||||
/* reader was still attached */
|
/* reader was still attached */
|
||||||
ofs -= ring->ofs;
|
ofs -= ring->ofs;
|
||||||
BUG_ON(ofs >= b_size(&ring->buf));
|
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(b_peek(&ring->buf, ofs), 1);
|
||||||
}
|
}
|
||||||
HA_ATOMIC_SUB(&ring->readers_count, 1);
|
HA_ATOMIC_SUB(&ring->readers_count, 1);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user