From ffa75215cc06d105bc2b43ddb8ed5d4deccd8988 Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Sat, 26 Nov 2011 16:29:54 +0100 Subject: [PATCH 1/1] Fix a race in pondering mode 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 --- src/search.cpp | 22 ++++++++++++---------- src/thread.cpp | 3 +++ src/uci.cpp | 5 ++--- 3 files changed, 17 insertions(+), 13 deletions(-) diff --git a/src/search.cpp b/src/search.cpp index b1581c6f..6615a1ef 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -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; } } } diff --git a/src/thread.cpp b/src/thread.cpp index 2978f188..e48ea6fd 100644 --- a/src/thread.cpp +++ b/src/thread.cpp @@ -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 diff --git a/src/uci.cpp b/src/uci.cpp index 8127a742..72e3d0bd 100644 --- a/src/uci.cpp +++ b/src/uci.cpp @@ -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") -- 2.39.2