From: Marco Costalba Date: Mon, 25 Jan 2010 14:01:20 +0000 (+0100) Subject: Fix a race in idle_loop() exiting X-Git-Url: https://git.sesse.net/?p=stockfish;a=commitdiff_plain;h=c5e71f515045029f4d89f1302277217b878fa7a4 Fix a race in idle_loop() exiting When pondering threads are put to sleep, but when thinking the threads are parked in idle_loop in a tight polling loop checking for workIsWaiting falg. So before we set the slave's flag workIsWaiting we have to guarantee that all the slave data is already setup because slave can start in any moment from there. Rearrange the last loop to fix this race. Signed-off-by: Marco Costalba --- diff --git a/src/search.cpp b/src/search.cpp index f259c8fb..7ba64c44 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -3010,13 +3010,14 @@ namespace { // their idle loop. Also copy search stack tail for each slave thread. for (int i = 0; i < ActiveThreads; i++) { + if (splitPoint->slaves[i]) + memcpy(splitPoint->sstack[i] + ply - 1, sstck + ply - 1, 3 * sizeof(SearchStack)); + if (i == master || splitPoint->slaves[i]) { - Threads[i].workIsWaiting = true; Threads[i].stop = false; + Threads[i].workIsWaiting = true; // This makes the slave to exit from idle_loop() } - if (splitPoint->slaves[i]) - memcpy(splitPoint->sstack[i] + ply - 1, sstck + ply - 1, 3 * sizeof(SearchStack)); } // Everything is set up. The master thread enters the idle loop, from