X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fthread.cpp;h=4ae268eb77b9ae885554bf4e60c78ef1e2ebf032;hp=65d01d9100a874e19db9addea3772bafa735dd69;hb=0439a79566d03065317b2025b9b479b9ae9f2d65;hpb=3aa471f2a9cb1cccd37c27906dd386b9724e32ab diff --git a/src/thread.cpp b/src/thread.cpp index 65d01d91..4ae268eb 100644 --- a/src/thread.cpp +++ b/src/thread.cpp @@ -137,7 +137,6 @@ void Thread::main_loop() { void Thread::wake_up() { lock_grab(sleepLock); - do_sleep = false; cond_signal(sleepCond); lock_release(sleepLock); } @@ -257,6 +256,7 @@ void ThreadsManager::wake_up() const { for (int i = 0; i < size(); i++) { threads[i]->maxPly = 0; + threads[i]->do_sleep = false; if (!useSleepingThreads) threads[i]->wake_up(); @@ -309,7 +309,7 @@ Value ThreadsManager::split(Position& pos, Stack* ss, Value alpha, Value beta, assert(beta <= VALUE_INFINITE); assert(depth > DEPTH_ZERO); - int master = pos.thread(); + int master = pos.this_thread(); Thread& masterThread = *threads[master]; if (masterThread.splitPointsCnt >= MAX_SPLITPOINTS_PER_THREAD) @@ -419,20 +419,21 @@ void ThreadsManager::wait_for_search_finished() { Thread* main = threads[0]; 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); } -// 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. +// ThreadsManager::start_searching() wakes up the main thread sleeping in +// main_loop() so to start a new search, then returns immediately. void ThreadsManager::start_searching(const Position& pos, const LimitsType& limits, - const std::set& searchMoves, bool async) { + const std::vector& searchMoves) { wait_for_search_finished(); + SearchTime.restart(); // As early as possible + Signals.stopOnPonderhit = Signals.firstRootMove = false; Signals.stop = Signals.failedLowAtRoot = false; @@ -441,11 +442,9 @@ void ThreadsManager::start_searching(const Position& pos, const LimitsType& limi RootMoves.clear(); for (MoveList ml(pos); !ml.end(); ++ml) - if (searchMoves.empty() || searchMoves.count(ml.move())) + if (searchMoves.empty() || count(searchMoves.begin(), searchMoves.end(), ml.move())) RootMoves.push_back(RootMove(ml.move())); - threads[0]->wake_up(); // Start main thread - - if (!async) - wait_for_search_finished(); + threads[0]->do_sleep = false; + threads[0]->wake_up(); }