From: Willy Tarreau Date: Thu, 5 Sep 2019 14:39:21 +0000 (+0200) Subject: MINOR: fd: add two new calls fd_cond_{recv,send}() X-Git-Tag: v2.1-dev2~98 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8f2825f3ab81cc730b080b9000fe1364187b7b59;p=thirdparty%2Fhaproxy.git MINOR: fd: add two new calls fd_cond_{recv,send}() These two functions are used to enable recv/send but only if the FD is not marked as active yet. The purpose is to conditionally mark them as tentatively usable without interfering with the polling if polling was already enabled, when it's supposed to be likely true. --- diff --git a/include/proto/fd.h b/include/proto/fd.h index 747b34f78e..e3b0b2b2f7 100644 --- a/include/proto/fd.h +++ b/include/proto/fd.h @@ -241,6 +241,26 @@ static inline void fd_may_recv(const int fd) return; } +/* Report that FD may receive again without polling but only if its not + * active yet. This is in order to speculatively try to enable I/Os when it's + * highly likely that these will succeed, but without interfering with polling. + */ +static inline void fd_cond_recv(const int fd) +{ + if ((fdtab[fd].state & (FD_EV_ACTIVE_R|FD_EV_READY_R)) == 0) + HA_ATOMIC_BTS(&fdtab[fd].state, FD_EV_READY_R_BIT); +} + +/* Report that FD may send again without polling but only if its not + * active yet. This is in order to speculatively try to enable I/Os when it's + * highly likely that these will succeed, but without interfering with polling. + */ +static inline void fd_cond_send(const int fd) +{ + if ((fdtab[fd].state & (FD_EV_ACTIVE_W|FD_EV_READY_W)) == 0) + HA_ATOMIC_BTS(&fdtab[fd].state, FD_EV_READY_W_BIT); +} + /* Report that FD may receive and send without polling. Used at FD * initialization. */