From 8f2825f3ab81cc730b080b9000fe1364187b7b59 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Thu, 5 Sep 2019 16:39:21 +0200 Subject: [PATCH] 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. --- include/proto/fd.h | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/include/proto/fd.h b/include/proto/fd.h index 747b34f78..e3b0b2b2f 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. */