diff --git a/src/search.cpp b/src/search.cpp index 4a1a3523..99985fde 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -227,10 +227,9 @@ void MainThread::search() { // Threads.stop. However, if we are pondering or in an infinite search, // the UCI protocol states that we shouldn't print the best move before the // GUI sends a "stop" or "ponderhit" command. We therefore simply wait here - // until the GUI sends one of those commands (which also raises Threads.stop). - Threads.stopOnPonderhit = true; + // until the GUI sends one of those commands. - while (!Threads.stop && (Threads.ponder || Limits.infinite)) + while (!Threads.stop && (ponder || Limits.infinite)) {} // Busy wait for a stop or a ponder reset // Stop the threads if not already stopped (also raise the stop if @@ -448,7 +447,7 @@ void Thread::search() { { failedHighCnt = 0; failedLow = true; - Threads.stopOnPonderhit = false; + mainThread->stopOnPonderhit = false; } } else if (bestValue >= beta) @@ -497,7 +496,7 @@ void Thread::search() { // Do we have time for the next iteration? Can we stop searching now? if ( Limits.use_time_management() && !Threads.stop - && !Threads.stopOnPonderhit) + && !mainThread->stopOnPonderhit) { double fallingEval = (306 + 119 * failedLow + 6 * (mainThread->previousScore - bestValue)) / 581.0; fallingEval = std::max(0.5, std::min(1.5, fallingEval)); @@ -515,8 +514,8 @@ void Thread::search() { { // If we are allowed to ponder do not stop the search now but // keep pondering until the GUI sends "ponderhit" or "stop". - if (Threads.ponder) - Threads.stopOnPonderhit = true; + if (mainThread->ponder) + mainThread->stopOnPonderhit = true; else Threads.stop = true; } @@ -1595,10 +1594,10 @@ void MainThread::check_time() { } // We should not stop pondering until told so by the GUI - if (Threads.ponder) + if (ponder) return; - if ( (Limits.use_time_management() && elapsed > Time.maximum() - 10) + if ( (Limits.use_time_management() && (elapsed > Time.maximum() - 10 || stopOnPonderhit)) || (Limits.movetime && elapsed >= Limits.movetime) || (Limits.nodes && Threads.nodes_searched() >= (uint64_t)Limits.nodes)) Threads.stop = true; diff --git a/src/thread.cpp b/src/thread.cpp index f88e359b..6c1d7299 100644 --- a/src/thread.cpp +++ b/src/thread.cpp @@ -162,8 +162,8 @@ void ThreadPool::start_thinking(Position& pos, StateListPtr& states, main()->wait_for_search_finished(); - stopOnPonderhit = stop = false; - ponder = ponderMode; + main()->stopOnPonderhit = stop = false; + main()->ponder = ponderMode; Search::Limits = limits; Search::RootMoves rootMoves; diff --git a/src/thread.h b/src/thread.h index e377e992..686441cb 100644 --- a/src/thread.h +++ b/src/thread.h @@ -88,6 +88,8 @@ struct MainThread : public Thread { double bestMoveChanges, previousTimeReduction; Value previousScore; int callsCnt; + bool stopOnPonderhit; + std::atomic_bool ponder; }; @@ -105,7 +107,7 @@ struct ThreadPool : public std::vector { uint64_t nodes_searched() const { return accumulate(&Thread::nodes); } uint64_t tb_hits() const { return accumulate(&Thread::tbHits); } - std::atomic_bool stop, ponder, stopOnPonderhit; + std::atomic_bool stop; private: StateListPtr setupStates; diff --git a/src/uci.cpp b/src/uci.cpp index 36d359c6..739cf343 100644 --- a/src/uci.cpp +++ b/src/uci.cpp @@ -207,18 +207,16 @@ void UCI::loop(int argc, char* argv[]) { token.clear(); // Avoid a stale if getline() returns empty or blank line is >> skipws >> token; + if ( token == "quit" + || token == "stop") + Threads.stop = true; + // The GUI sends 'ponderhit' to tell us the user has played the expected move. // So 'ponderhit' will be sent if we were told to ponder on the same move the // user has played. We should continue searching but switch from pondering to - // normal search. In case Threads.stopOnPonderhit is set we are waiting for - // 'ponderhit' to stop the search, for instance if max search depth is reached. - if ( token == "quit" - || token == "stop" - || (token == "ponderhit" && Threads.stopOnPonderhit)) - Threads.stop = true; - + // normal search. else if (token == "ponderhit") - Threads.ponder = false; // Switch to normal search + Threads.main()->ponder = false; // Switch to normal search else if (token == "uci") sync_cout << "id name " << engine_info(true)