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.
This commit is contained in:
Willy Tarreau 2018-07-18 08:18:20 +02:00
parent 910b2bc829
commit 8318885487
3 changed files with 13 additions and 12 deletions

View File

@ -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 <ctx>.
* Returns < 0 on error.
*/

View File

@ -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;
}
}

View File

@ -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) {