From: Willy Tarreau Date: Tue, 16 Oct 2018 14:11:56 +0000 (+0200) Subject: BUG/MEDIUM: threads: fix thread_release() at the end of the rendez-vous point X-Git-Tag: v1.9-dev4~31 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a9c0252b2e8ff7bb728b84d977ac6e9581ea12f8;p=thirdparty%2Fhaproxy.git BUG/MEDIUM: threads: fix thread_release() at the end of the rendez-vous point There is a bug in this function used to release other threads. It leaves the current thread marked as harmless. If after this another thread does a thread_isolate(), but before the first one reaches poll(), the second thread will believe it's alone while it's not. This must be backported to 1.8 since the rendez-vous point was merged into 1.8.14. --- diff --git a/src/hathreads.c b/src/hathreads.c index 2ee31de696..075866a609 100644 --- a/src/hathreads.c +++ b/src/hathreads.c @@ -88,12 +88,8 @@ void thread_isolate() */ void thread_release() { - while (1) { - HA_ATOMIC_AND(&threads_want_rdv_mask, ~tid_bit); - if (!(threads_want_rdv_mask & all_threads_mask)) - break; - thread_harmless_till_end(); - } + HA_ATOMIC_AND(&threads_want_rdv_mask, ~tid_bit); + thread_harmless_end(); } __attribute__((constructor))