From 3aa471f2a9cb1cccd37c27906dd386b9724e32ab Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Mon, 26 Mar 2012 17:19:37 +0200 Subject: [PATCH] Introduce and use wait_for_search_finished() Helper function that allows us to simplify the code. No functional change. Signed-off-by: Marco Costalba --- src/benchmark.cpp | 2 +- src/thread.cpp | 65 ++++++++++++++++------------------------------- src/thread.h | 7 +++-- src/uci.cpp | 12 ++++++--- 4 files changed, 35 insertions(+), 51 deletions(-) diff --git a/src/benchmark.cpp b/src/benchmark.cpp index 4124899b..9f0ac0c1 100644 --- a/src/benchmark.cpp +++ b/src/benchmark.cpp @@ -118,7 +118,7 @@ void benchmark(int argc, char* argv[]) { } else { - Threads.start_thinking(pos, limits); + Threads.start_searching(pos, limits); nodes += Search::RootPosition.nodes_searched(); } } diff --git a/src/thread.cpp b/src/thread.cpp index f2a2c821..65d01d91 100644 --- a/src/thread.cpp +++ b/src/thread.cpp @@ -50,7 +50,7 @@ Thread::Thread(Fn fn) { start_fn = fn; threadID = Threads.size(); - do_sleep = (fn != &Thread::main_loop); // Avoid a race with start_thinking() + do_sleep = (fn != &Thread::main_loop); // Avoid a race with start_searching() lock_init(sleepLock); cond_init(sleepCond); @@ -137,6 +137,7 @@ void Thread::main_loop() { void Thread::wake_up() { lock_grab(sleepLock); + do_sleep = false; cond_signal(sleepCond); lock_release(sleepLock); } @@ -154,10 +155,7 @@ void Thread::wait_for_stop_or_ponderhit() { Signals.stopOnPonderhit = true; lock_grab(sleepLock); - - while (!Signals.stop) - cond_wait(sleepCond, sleepLock); - + while (!Signals.stop) cond_wait(sleepCond, sleepLock); lock_release(sleepLock); } @@ -258,7 +256,6 @@ void ThreadsManager::wake_up() const { for (int i = 0; i < size(); i++) { - threads[i]->do_sleep = false; threads[i]->maxPly = 0; if (!useSleepingThreads) @@ -273,7 +270,7 @@ void ThreadsManager::wake_up() const { void ThreadsManager::sleep() const { for (int i = 1; i < size(); i++) // Main thread will go to sleep by itself - threads[i]->do_sleep = true; // to avoid a race with start_thinking() + threads[i]->do_sleep = true; // to avoid a race with start_searching() } @@ -415,19 +412,26 @@ void ThreadsManager::set_timer(int msec) { } -// ThreadsManager::start_thinking() is used by UI thread to wake up the main +// ThreadsManager::wait_for_search_finished() waits for main thread to go to +// sleep, this means search is finished. Then returns. + +void ThreadsManager::wait_for_search_finished() { + + Thread* main = threads[0]; + lock_grab(main->sleepLock); + while (!main->do_sleep) cond_wait(sleepCond, main->sleepLock); + lock_release(main->sleepLock); +} + + +// ThreadsManager::start_searching() is used by UI thread to wake up the main // thread parked in main_loop() and starting a new search. If async is true // then function returns immediately, otherwise caller is blocked waiting for // the search to finish. -void ThreadsManager::start_thinking(const Position& pos, const LimitsType& limits, - const std::set& searchMoves, bool async) { - Thread& main = *threads.front(); - - lock_grab(main.sleepLock); - - while (!main.do_sleep) - cond_wait(sleepCond, main.sleepLock); // Wait main thread has finished +void ThreadsManager::start_searching(const Position& pos, const LimitsType& limits, + const std::set& searchMoves, bool async) { + wait_for_search_finished(); Signals.stopOnPonderhit = Signals.firstRootMove = false; Signals.stop = Signals.failedLowAtRoot = false; @@ -440,33 +444,8 @@ void ThreadsManager::start_thinking(const Position& pos, const LimitsType& limit if (searchMoves.empty() || searchMoves.count(ml.move())) RootMoves.push_back(RootMove(ml.move())); - main.do_sleep = false; - cond_signal(main.sleepCond); // Wake up main thread and start searching + threads[0]->wake_up(); // Start main thread if (!async) - while (!main.do_sleep) - cond_wait(sleepCond, main.sleepLock); - - lock_release(main.sleepLock); -} - - -// ThreadsManager::stop_thinking() is used by UI thread to raise a stop request -// and to wait for the main thread finishing the search. We cannot return before -// main has finished to avoid a crash in case of a 'quit' command. - -void ThreadsManager::stop_thinking() { - - Thread& main = *threads.front(); - - Search::Signals.stop = true; - - lock_grab(main.sleepLock); - - cond_signal(main.sleepCond); // In case is waiting for stop or ponderhit - - while (!main.do_sleep) - cond_wait(sleepCond, main.sleepLock); - - lock_release(main.sleepLock); + wait_for_search_finished(); } diff --git a/src/thread.h b/src/thread.h index 04e02306..e6a4cf95 100644 --- a/src/thread.h +++ b/src/thread.h @@ -47,7 +47,6 @@ struct SplitPoint { MovePicker* mp; SplitPoint* parent; - // Shared data Lock lock; volatile uint64_t slavesMask; @@ -125,9 +124,9 @@ public: void read_uci_options(); bool available_slave_exists(int master) const; void set_timer(int msec); - void stop_thinking(); - void start_thinking(const Position& pos, const Search::LimitsType& limits, - const std::set& = std::set(), bool async = false); + void wait_for_search_finished(); + void start_searching(const Position& pos, const Search::LimitsType& limits, + const std::set& = std::set(), bool async = false); template Value split(Position& pos, Search::Stack* ss, Value alpha, Value beta, Value bestValue, Move* bestMove, diff --git a/src/uci.cpp b/src/uci.cpp index 718c7875..987da9c1 100644 --- a/src/uci.cpp +++ b/src/uci.cpp @@ -67,7 +67,10 @@ void uci_loop() { is >> skipws >> token; if (token == "quit" || token == "stop") - Threads.stop_thinking(); + { + Search::Signals.stop = true; + Threads.wait_for_search_finished(); // Cannot quit while threads are running + } else if (token == "ponderhit") { @@ -77,7 +80,10 @@ void uci_loop() { Search::Limits.ponder = false; if (Search::Signals.stopOnPonderhit) - Threads.stop_thinking(); + { + Search::Signals.stop = true; + Threads.wait_for_search_finished(); + } } else if (token == "go") @@ -223,7 +229,7 @@ namespace { limits.time = time[pos.side_to_move()]; limits.increment = inc[pos.side_to_move()]; - Threads.start_thinking(pos, limits, searchMoves, true); + Threads.start_searching(pos, limits, searchMoves, true); } -- 2.39.2