Fix a race in idle_loop() exiting
authorMarco Costalba <mcostalba@gmail.com>
Mon, 25 Jan 2010 14:01:20 +0000 (15:01 +0100)
committerMarco Costalba <mcostalba@gmail.com>
Mon, 25 Jan 2010 14:02:06 +0000 (15:02 +0100)
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 <mcostalba@gmail.com>
src/search.cpp

index f259c8fb5938822d9fe1093de1842a7cb7274e16..7ba64c44337dbe3de43276342f89670d03ed64ba 100644 (file)
@@ -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