From 62a627ac197fe69dcf60d87eac943c8f7f8de2f6 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Thu, 25 Jan 2018 18:06:46 +0100 Subject: [PATCH] MEDIUM: poller: use atomic ops to update the fdtab mask We don't need to lock the fdtab[].lock anymore since we only have one modification left (update update_mask). Let's use an atomic AND instead. --- src/ev_epoll.c | 4 +--- src/ev_kqueue.c | 4 +--- src/ev_poll.c | 4 +--- src/ev_select.c | 4 +--- 4 files changed, 4 insertions(+), 12 deletions(-) diff --git a/src/ev_epoll.c b/src/ev_epoll.c index 3edaf288c..b98ca8ca8 100644 --- a/src/ev_epoll.c +++ b/src/ev_epoll.c @@ -79,10 +79,8 @@ REGPRM2 static void _do_poll(struct poller *p, int exp) continue; } - HA_SPIN_LOCK(FD_LOCK, &fdtab[fd].lock); - fdtab[fd].update_mask &= ~tid_bit; en = fdtab[fd].state; - HA_SPIN_UNLOCK(FD_LOCK, &fdtab[fd].lock); + HA_ATOMIC_AND(&fdtab[fd].update_mask, ~tid_bit); if (fdtab[fd].polled_mask & tid_bit) { if (!(fdtab[fd].thread_mask & tid_bit) || !(en & FD_EV_POLLED_RW)) { diff --git a/src/ev_kqueue.c b/src/ev_kqueue.c index fcd04fda9..cc96307b0 100644 --- a/src/ev_kqueue.c +++ b/src/ev_kqueue.c @@ -52,10 +52,8 @@ REGPRM2 static void _do_poll(struct poller *p, int exp) continue; } - HA_SPIN_LOCK(FD_LOCK, &fdtab[fd].lock); - fdtab[fd].update_mask &= ~tid_bit; en = fdtab[fd].state; - HA_SPIN_UNLOCK(FD_LOCK, &fdtab[fd].lock); + HA_ATOMIC_AND(&fdtab[fd].update_mask, ~tid_bit); if (!(fdtab[fd].thread_mask & tid_bit) || !(en & FD_EV_POLLED_RW)) { if (!(fdtab[fd].polled_mask & tid_bit)) { diff --git a/src/ev_poll.c b/src/ev_poll.c index 22cb22757..edcfe6565 100644 --- a/src/ev_poll.c +++ b/src/ev_poll.c @@ -70,10 +70,8 @@ REGPRM2 static void _do_poll(struct poller *p, int exp) continue; } - HA_SPIN_LOCK(FD_LOCK, &fdtab[fd].lock); - fdtab[fd].update_mask &= ~tid_bit; en = fdtab[fd].state; - HA_SPIN_UNLOCK(FD_LOCK, &fdtab[fd].lock); + HA_ATOMIC_AND(&fdtab[fd].update_mask, ~tid_bit); /* we have a single state for all threads, which is why we * don't check the tid_bit. First thread to see the update diff --git a/src/ev_select.c b/src/ev_select.c index db0814d6e..6e834678d 100644 --- a/src/ev_select.c +++ b/src/ev_select.c @@ -62,10 +62,8 @@ REGPRM2 static void _do_poll(struct poller *p, int exp) continue; } - HA_SPIN_LOCK(FD_LOCK, &fdtab[fd].lock); - fdtab[fd].update_mask &= ~tid_bit; en = fdtab[fd].state; - HA_SPIN_UNLOCK(FD_LOCK, &fdtab[fd].lock); + HA_ATOMIC_AND(&fdtab[fd].update_mask, ~tid_bit); /* we have a single state for all threads, which is why we * don't check the tid_bit. First thread to see the update