diff --git a/include/haproxy/fd.h b/include/haproxy/fd.h index cf2d02b78..010fdacf8 100644 --- a/include/haproxy/fd.h +++ b/include/haproxy/fd.h @@ -369,11 +369,13 @@ static inline unsigned int hap_fd_isset(int fd, unsigned int *evts) return evts[fd / (8*sizeof(*evts))] & (1U << (fd & (8*sizeof(*evts) - 1))); } -static inline void wake_thread(int tid) +static inline void wake_thread(int thr) { - char c = 'c'; - - DISGUISE(write(poller_wr_pipe[tid], &c, 1)); + if (sleeping_thread_mask & (1UL << thr)) { + char c = 'c'; + _HA_ATOMIC_AND(&sleeping_thread_mask, ~(1UL << thr)); + DISGUISE(write(poller_wr_pipe[thr], &c, 1)); + } } diff --git a/src/fd.c b/src/fd.c index 079df15af..96d77bd55 100644 --- a/src/fd.c +++ b/src/fd.c @@ -454,7 +454,6 @@ void updt_fd_polling(const int fd) /* we need to wake up one thread to handle it immediately */ int thr = my_ffsl(fdtab[fd].thread_mask & ~tid_bit & all_threads_mask) - 1; - _HA_ATOMIC_AND(&sleeping_thread_mask, ~(1UL << thr)); wake_thread(thr); } } diff --git a/src/task.c b/src/task.c index fc698d52b..76a743273 100644 --- a/src/task.c +++ b/src/task.c @@ -86,10 +86,7 @@ void task_kill(struct task *t) list_to_mt_list(&((struct tasklet *)t)->list)); _HA_ATOMIC_INC(&ha_thread_ctx[thr].rq_total); _HA_ATOMIC_INC(&ha_thread_ctx[thr].tasks_in_list); - if (sleeping_thread_mask & (1UL << thr)) { - _HA_ATOMIC_AND(&sleeping_thread_mask, ~(1UL << thr)); - wake_thread(thr); - } + wake_thread(thr); return; } } @@ -124,10 +121,7 @@ void tasklet_kill(struct tasklet *t) MT_LIST_APPEND(&ha_thread_ctx[thr].shared_tasklet_list, list_to_mt_list(&t->list)); _HA_ATOMIC_INC(&ha_thread_ctx[thr].rq_total); - if (sleeping_thread_mask & (1UL << thr)) { - _HA_ATOMIC_AND(&sleeping_thread_mask, ~(1UL << thr)); - wake_thread(thr); - } + wake_thread(thr); return; } } @@ -168,10 +162,7 @@ void __tasklet_wakeup_on(struct tasklet *tl, int thr) /* this tasklet runs on a specific thread. */ MT_LIST_APPEND(&ha_thread_ctx[thr].shared_tasklet_list, list_to_mt_list(&tl->list)); _HA_ATOMIC_INC(&ha_thread_ctx[thr].rq_total); - if (sleeping_thread_mask & (1UL << thr)) { - _HA_ATOMIC_AND(&sleeping_thread_mask, ~(1UL << thr)); - wake_thread(thr); - } + wake_thread(thr); } } @@ -262,12 +253,7 @@ void __task_wakeup(struct task *t) /* If all threads that are supposed to handle this task are sleeping, * wake one. */ - if (sleeping_thread_mask & (1UL << thr)) { - unsigned long m = 1UL << thr; - - _HA_ATOMIC_AND(&sleeping_thread_mask, ~m); - wake_thread(thr); - } + wake_thread(thr); } #endif return;