Fix a race in pondering mode
authorMarco Costalba <mcostalba@gmail.com>
Sat, 26 Nov 2011 15:29:54 +0000 (16:29 +0100)
committerMarco Costalba <mcostalba@gmail.com>
Sat, 26 Nov 2011 17:29:40 +0000 (18:29 +0100)
Fixes an hang when playing with ponder ON. Perhaps there is still
a very small race but now it seems engine does not hang anymore.

No functional change.

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

index b1581c6ff222f60d27349ac57274ad6e4bb2d8a4..6615a1efacbc2bc1454ad0732568ab3c2716a8c1 100644 (file)
@@ -367,9 +367,6 @@ void Search::think() {
   // Save "search start" time and reset elapsed time to zero
   elapsed_search_time(get_system_time());
 
-  // Reset global search signals
-  memset((void*)&Signals, 0, sizeof(Signals));
-
   // Set output stream mode: normal or chess960. Castling notation is different
   cout << set960(pos.is_chess960());
 
@@ -651,6 +648,8 @@ namespace {
         // Do we have time for the next iteration? Can we stop searching now?
         if (!Signals.stop && !Signals.stopOnPonderhit && Limits.useTimeManagement())
         {
+            bool stop = false; // Local variable instead of the volatile Signals.stop
+
             // Take in account some extra time if the best move has changed
             if (depth > 4 && depth < 50)
                 TimeMgr.pv_instability(bestMoveChanges[depth], bestMoveChanges[depth - 1]);
@@ -658,11 +657,11 @@ namespace {
             // Stop search if most of available time is already consumed. We probably don't
             // have enough time to search the first move at the next iteration anyway.
             if (elapsed_search_time() > (TimeMgr.available_time() * 62) / 100)
-                Signals.stop = true;
+                stop = true;
 
             // Stop search early if one move seems to be much better than others
             if (   depth >= 10
-                && !Signals.stop
+                && !stop
                 && (   bestMoveNeverChanged
                     || elapsed_search_time() > (TimeMgr.available_time() * 40) / 100))
             {
@@ -674,14 +673,17 @@ namespace {
                 (ss+1)->excludedMove = MOVE_NONE;
 
                 if (v < rBeta)
-                    Signals.stop = true;
+                    stop = true;
             }
 
-            // If we are allowed to ponder do not stop the search now but keep pondering
-            if (Signals.stop && Limits.ponder) // FIXME Limits.ponder is racy
+            if (stop)
             {
-                Signals.stop = false;
-                Signals.stopOnPonderhit = true;
+                // If we are allowed to ponder do not stop the search now but
+                // keep pondering until GUI sends "ponderhit" or "stop".
+                if (Limits.ponder) // FIXME racing
+                    Signals.stopOnPonderhit = true;
+                else
+                    Signals.stop = true;
             }
         }
     }
index 2978f188b6878be190a4c2b366e509489ac27a99..e48ea6fd38e6cc22188c5fb20029353f84966309 100644 (file)
@@ -438,6 +438,9 @@ void ThreadsManager::start_thinking(bool asyncMode) {
   while (!main.do_sleep)
       cond_wait(&sleepCond, &main.sleepLock);
 
+  // Reset signals before to start the search
+  memset((void*)&Search::Signals, 0, sizeof(Search::Signals));
+
   main.do_sleep = false;
   cond_signal(&main.sleepCond); // Wake up main thread
 
index 8127a742c8ea4907fa41dbf1c5eb295aae651ca4..72e3d0bd0cd4600f5c1694c884ff769b1a1d6a66 100644 (file)
@@ -82,10 +82,9 @@ void uci_loop() {
           Search::Limits.ponder = false; // FIXME racing
 
           if (Search::Signals.stopOnPonderhit)
-          {
               Search::Signals.stop = true;
-              Threads[0].wake_up(); // In case is waiting for stop or ponderhit
-          }
+
+          Threads[0].wake_up(); // In case is waiting for stop or ponderhit
       }
 
       else if (token == "go")