From: Christopher Faulet Date: Fri, 16 Apr 2021 09:33:39 +0000 (+0200) Subject: MINOR: threads: Only consider running threads to end a thread harmeless period X-Git-Tag: v2.4-dev17~107 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=76b44195c9020e0f2cab4d983e9346d9de6c895f;p=thirdparty%2Fhaproxy.git MINOR: threads: Only consider running threads to end a thread harmeless period When a thread ends its harmeless period, we must only consider running threads when testing threads_want_rdv_mask mask. To do so, we reintroduce all_threads_mask mask in the bitwise operation (It was removed to fix a deadlock). Note that for now it is useless because there is no way to stop threads or to have threads reserved for another task. But it is safer this way to avoid bugs in the future. --- diff --git a/include/haproxy/thread.h b/include/haproxy/thread.h index af909f1702..e7d6d2cba2 100644 --- a/include/haproxy/thread.h +++ b/include/haproxy/thread.h @@ -265,7 +265,7 @@ static inline void thread_harmless_end() { while (1) { HA_ATOMIC_AND(&threads_harmless_mask, ~tid_bit); - if (likely((threads_want_rdv_mask & ~tid_bit) == 0)) + if (likely((threads_want_rdv_mask & all_threads_mask & ~tid_bit) == 0)) break; thread_harmless_till_end(); } diff --git a/src/thread.c b/src/thread.c index 742e47c09d..07017dd189 100644 --- a/src/thread.c +++ b/src/thread.c @@ -56,7 +56,7 @@ struct lock_stat lock_stats[LOCK_LABELS]; void thread_harmless_till_end() { _HA_ATOMIC_OR(&threads_harmless_mask, tid_bit); - while (threads_want_rdv_mask & ~tid_bit) { + while (threads_want_rdv_mask & all_threads_mask & ~tid_bit) { ha_thread_relax(); } }