]> git.sesse.net Git - stockfish/commitdiff
Be sure threads are woken in wake_sleeping_threads()
authorMarco Costalba <mcostalba@gmail.com>
Sat, 13 Feb 2010 11:02:34 +0000 (12:02 +0100)
committerMarco Costalba <mcostalba@gmail.com>
Sat, 13 Feb 2010 11:02:34 +0000 (12:02 +0100)
Wait inside wake_sleeping_threads() for the threads to be
effectively and reliably woken up.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
src/search.cpp

index fbae76d7720fee3dd5833697b0b70be412428b5c..22bc0156705121a9a02adfcd8b59c1ff66e21997 100644 (file)
@@ -2793,9 +2793,12 @@ namespace {
 #else
             WaitForSingleObject(SitIdleEvent[threadID], INFINITE);
 #endif
-            Threads[threadID].sleeping = false;
         }
 
+        // Out of the while loop to avoid races in case thread is woken up but
+        // while condition still holds true so that is put to sleep again.
+        Threads[threadID].sleeping = false;
+
       // If this thread has been assigned work, launch a search
       if (Threads[threadID].workIsWaiting)
       {
@@ -3051,6 +3054,8 @@ namespace {
     {
         for (int i = 1; i < ActiveThreads; i++)
         {
+            assert(Threads[i].sleeping == true);
+
             Threads[i].idle = true;
             Threads[i].workIsWaiting = false;
         }
@@ -3063,6 +3068,10 @@ namespace {
       for (int i = 1; i < THREAD_MAX; i++)
           SetEvent(SitIdleEvent[i]);
 #endif
+
+      // Wait for the threads to be all woken up
+      for (int i = 1; i < ActiveThreads; i++)
+           while (Threads[i].sleeping);
     }
   }