From ddc874c46c585cf2962468788c78c57ddcd89c6f Mon Sep 17 00:00:00 2001 From: Olivier Houchard Date: Wed, 17 Jun 2020 20:34:05 +0200 Subject: [PATCH] BUG/MEDIUM: fd: Call fd_stop_recv() when we just got a fd. In fd_takeover(), when a double-width compare-and-swap is implemented, make sure, if we managed to get the fd, to call fd_stop_recv() on it, so that the thread that used to own it will know it has to stop polling it. --- src/fd.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/fd.c b/src/fd.c index 1fcf1d43c..51740c39a 100644 --- a/src/fd.c +++ b/src/fd.c @@ -389,6 +389,12 @@ int fd_takeover(int fd, void *expected_owner) } while (!(_HA_ATOMIC_DWCAS(&fdtab[fd].running_mask, &old_masks, &new_masks))); _HA_ATOMIC_AND(&fdtab[fd].running_mask, ~tid_bit); + /* Make sure the FD doesn't have the active bit. It is possible that + * the fd is polled by the thread that used to own it, the new thread + * is supposed to call subscribe() later, to activate polling. + */ + fd_stop_recv(fd); + return 0; #endif /* HW_HAVE_CAS_DW */ }