From c5e71f515045029f4d89f1302277217b878fa7a4 Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Mon, 25 Jan 2010 15:01:20 +0100 Subject: [PATCH 1/1] 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 --- src/search.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) 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 -- 2.39.2