Le 20/07/2018 à 10:38, Willy Tarreau a écrit :
On Fri, Jul 20, 2018 at 10:27:42AM +0200, Christopher Faulet wrote:
In thread_sync_barrier, we exit when all threads have set their own bit in the
barrier mask. It is done by comparing it to all_threads_mask. But we must not
use a simple equality to do so, becaue all_threads_mask may change. Since commit
ba86c6c25 ("MINOR: threads: Be sure to remove threads from all_threads_mask on
exit"), when a thread exit, its bit is removed from all_threads_mask. Instead,
we must use a bitwise AND to test is all bits of all_threads_mask are set.

I agree on the principle, however it may still not work because
all_threads_mask is not marked volatile, so the compiler will most of
the time fetch the value into a register and will loop on it, keeping
the wrong value all the time. The case where it matters is when the
all_threads_mask is fetched and cached when entering the function,
then loses the value while barrier still has this bit set.

Thus I think that adding only this to your patch will definitely kill
this bug :

Damn! I forgot to check that. We talked about it 30 min ago though!

--
Christopher Faulet

Reply via email to