From 8318885487792bdfccf753d6de2554c006739e10 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Wed, 18 Jul 2018 08:18:20 +0200 Subject: [PATCH] MINOR: connection: simplify subscription by adding a registration function This new function wl_set_waitcb() prepopulates a wait_list with a tasklet and a context and returns it so that it can be passed to ->subscribe() to be added to a connection or conn_stream's wait_list. The caller doesn't need to know all the insiders details anymore this way. --- include/proto/connection.h | 9 +++++++++ src/checks.c | 6 +----- src/stream_interface.c | 10 +++------- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/include/proto/connection.h b/include/proto/connection.h index a2580f1..8344c95 100644 --- a/include/proto/connection.h +++ b/include/proto/connection.h @@ -773,6 +773,15 @@ static inline void cs_attach(struct conn_stream *cs, void *data, const struct da cs->data = data; } +static inline struct wait_list *wl_set_waitcb(struct wait_list *wl, struct task *(*cb)(struct task *, void *, unsigned short), void *ctx) +{ + if (!wl->task->process) { + wl->task->process = cb; + wl->task->context = ctx; + } + return wl; +} + /* Installs the connection's mux layer for upper context . * Returns < 0 on error. */ diff --git a/src/checks.c b/src/checks.c index 624a065..af6ddd4 100644 --- a/src/checks.c +++ b/src/checks.c @@ -779,11 +779,7 @@ static void __event_srv_chk_w(struct conn_stream *cs) goto out_wakeup; } if (b_data(&check->bo)) { - if (!cs->wait_list.task->process) { - cs->wait_list.task->process = event_srv_chk_w; - cs->wait_list.task->context = cs; - } - conn->mux->subscribe(cs, SUB_CAN_SEND, &cs->wait_list); + conn->mux->subscribe(cs, SUB_CAN_SEND, wl_set_waitcb(&cs->wait_list, event_srv_chk_w, cs)); goto out; } } diff --git a/src/stream_interface.c b/src/stream_interface.c index 6fb7b53..f1b52c1 100644 --- a/src/stream_interface.c +++ b/src/stream_interface.c @@ -732,13 +732,9 @@ static struct task * si_cs_send(struct task *t, void *ctx, unsigned short state) } } /* We couldn't send all of our data, let the mux know we'd like to send more */ - if (co_data(oc)) { - if (!cs->wait_list.task->process) { - cs->wait_list.task->process = si_cs_send; - cs->wait_list.task->context = ctx; - } - conn->mux->subscribe(cs, SUB_CAN_SEND, &cs->wait_list); - } + if (co_data(oc)) + conn->mux->subscribe(cs, SUB_CAN_SEND, wl_set_waitcb(&cs->wait_list, si_cs_send, ctx)); + wake_others: /* Maybe somebody was waiting for this conn_stream, wake them */ if (did_send) { -- 1.7.10.4