From: Joost VandeVondele Date: Fri, 4 Aug 2017 17:48:07 +0000 (+0200) Subject: Simplify finished search in ponder/infinite mode. X-Git-Url: https://git.sesse.net/?p=stockfish;a=commitdiff_plain;h=2783203428300cf0a6305b64691ad38fa340f253 Simplify finished search in ponder/infinite mode. In this rare case (e.g. go infinite on a stalemate), just spin till ponderhit/stop comes. The Thread::wait() is a renmant of the old YBWC code, today with lazy SMP, threads don't need to wait when outside of their idle loop. No functional change. --- diff --git a/src/search.cpp b/src/search.cpp index 3c638ca0..68069c23 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -277,13 +277,13 @@ void MainThread::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). - if (!Threads.stop && (Threads.ponder || Limits.infinite)) - { - Threads.stopOnPonderhit = true; - wait(Threads.stop); - } + Threads.stopOnPonderhit = true; + + while (!Threads.stop && (Threads.ponder || Limits.infinite)) + {} // Busy wait for a stop or a ponder reset - // Stop the threads if not already stopped + // Stop the threads if not already stopped (also raise the stop if + // "ponderhit" just reset Threads.ponder). Threads.stop = true; // Wait until all threads have finished diff --git a/src/thread.cpp b/src/thread.cpp index 6d3364d5..c602e0b4 100644 --- a/src/thread.cpp +++ b/src/thread.cpp @@ -68,24 +68,12 @@ void Thread::wait_for_search_finished() { } -/// Thread::wait() waits on sleep condition until condition is true - -void Thread::wait(std::atomic_bool& condition) { - - std::unique_lock lk(mutex); - sleepCondition.wait(lk, [&]{ return bool(condition); }); -} - - /// Thread::start_searching() wakes up the thread that will start the search -void Thread::start_searching(bool resume) { +void Thread::start_searching() { std::unique_lock lk(mutex); - - if (!resume) - searching = true; - + searching = true; sleepCondition.notify_one(); } diff --git a/src/thread.h b/src/thread.h index ee43bfb5..9b2e359b 100644 --- a/src/thread.h +++ b/src/thread.h @@ -52,9 +52,8 @@ public: virtual ~Thread(); virtual void search(); void idle_loop(); - void start_searching(bool resume = false); + void start_searching(); void wait_for_search_finished(); - void wait(std::atomic_bool& condition); Pawns::Table pawnsTable; Material::Table materialTable; diff --git a/src/uci.cpp b/src/uci.cpp index 58b38779..a56a5403 100644 --- a/src/uci.cpp +++ b/src/uci.cpp @@ -176,10 +176,8 @@ void UCI::loop(int argc, char* argv[]) { if ( token == "quit" || token == "stop" || (token == "ponderhit" && Threads.stopOnPonderhit)) - { Threads.stop = true; - Threads.main()->start_searching(true); // Could be sleeping - } + else if (token == "ponderhit") Threads.ponder = false; // Switch to normal search