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:
parent
910b2bc829
commit
8318885487
@ -773,6 +773,15 @@ static inline void cs_attach(struct conn_stream *cs, void *data, const struct da
|
|||||||
cs->data = data;
|
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>.
|
/* Installs the connection's mux layer for upper context <ctx>.
|
||||||
* Returns < 0 on error.
|
* Returns < 0 on error.
|
||||||
*/
|
*/
|
||||||
|
@ -779,11 +779,7 @@ static void __event_srv_chk_w(struct conn_stream *cs)
|
|||||||
goto out_wakeup;
|
goto out_wakeup;
|
||||||
}
|
}
|
||||||
if (b_data(&check->bo)) {
|
if (b_data(&check->bo)) {
|
||||||
if (!cs->wait_list.task->process) {
|
conn->mux->subscribe(cs, SUB_CAN_SEND, wl_set_waitcb(&cs->wait_list, event_srv_chk_w, cs));
|
||||||
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);
|
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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 */
|
/* We couldn't send all of our data, let the mux know we'd like to send more */
|
||||||
if (co_data(oc)) {
|
if (co_data(oc))
|
||||||
if (!cs->wait_list.task->process) {
|
conn->mux->subscribe(cs, SUB_CAN_SEND, wl_set_waitcb(&cs->wait_list, si_cs_send, ctx));
|
||||||
cs->wait_list.task->process = si_cs_send;
|
|
||||||
cs->wait_list.task->context = ctx;
|
|
||||||
}
|
|
||||||
conn->mux->subscribe(cs, SUB_CAN_SEND, &cs->wait_list);
|
|
||||||
}
|
|
||||||
wake_others:
|
wake_others:
|
||||||
/* Maybe somebody was waiting for this conn_stream, wake them */
|
/* Maybe somebody was waiting for this conn_stream, wake them */
|
||||||
if (did_send) {
|
if (did_send) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user