From: Willy Tarreau Date: Wed, 7 Nov 2018 06:47:52 +0000 (+0100) Subject: CLEANUP: stream-int: retro-document si_cs_io_cb() X-Git-Tag: v1.9-dev6~23 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8ccd2081f5ff6d165782fd2c45ea45ae75d273e9;p=thirdparty%2Fhaproxy.git CLEANUP: stream-int: retro-document si_cs_io_cb() It took me 17 minutes this morning to figure where si->wait_event was set (it's in si_reset() which should now probably be renamed since it doesn't just perform a reset anymore but also an allocation) and what its task was assigned to (si_cs_io_cb() even for applets and empty SI). This is too confusing and not intuitive enough, let's at least add a few comments for now to help figure how this stuff works next time. --- diff --git a/src/stream_interface.c b/src/stream_interface.c index b719c746db..ce5c3a9bcd 100644 --- a/src/stream_interface.c +++ b/src/stream_interface.c @@ -713,6 +713,11 @@ int si_cs_send(struct conn_stream *cs) return did_send; } +/* This is the ->process() function for any stream-interface's wait_event task. + * It's assigned during the stream-interface's initialization, for any type of + * stream interface. Thus it is always safe to perform a tasklet_wakeup() on a + * stream interface, as the presence of the CS is checked there. + */ struct task *si_cs_io_cb(struct task *t, void *ctx, unsigned short state) { struct stream_interface *si = ctx; @@ -721,7 +726,7 @@ struct task *si_cs_io_cb(struct task *t, void *ctx, unsigned short state) if (!cs) return NULL; -redo: + if (!(si->wait_event.wait_reason & SUB_CAN_SEND) && co_data(si_oc(si))) ret = si_cs_send(cs); if (!(si->wait_event.wait_reason & SUB_CAN_RECV))