}
+// ThreadsManager::wait_end_of_search() blocks UI thread until main thread has
+// returned to sleep in main_loop(). It is needed becuase xboard sends immediately
+// new position to search after a "stop" due to ponder miss.
+
+void ThreadsManager::wait_end_of_search() {
+
+ Thread& main = threads[0];
+
+ lock_grab(&main.sleepLock);
+
+ while (!main.do_sleep)
+ cond_wait(&sleepCond, &main.sleepLock);
+
+ lock_release(&main.sleepLock);
+}
+
+
// ThreadsManager::start_thinking() is used by UI thread to wake up the main
// thread parked in main_loop() and starting a new search. If asyncMode is true
// then function returns immediately, otherwise caller is blocked waiting for
Thread& main = threads[0];
- lock_grab(&main.sleepLock);
-
// Wait main thread has finished before to launch a new search
- while (!main.do_sleep)
- cond_wait(&sleepCond, &main.sleepLock);
+ wait_end_of_search();
+
+ lock_grab(&main.sleepLock);
// Reset signals before to start the search
memset((void*)&Search::Signals, 0, sizeof(Search::Signals));
void start_thinking(bool asyncMode = true);
void set_timer(int msec);
void wait_for_stop_or_ponderhit();
+ void wait_end_of_search();
template <bool Fake>
Value split(Position& pos, SearchStack* ss, Value alpha, Value beta, Value bestValue,
quit = (token == "quit");
Search::Signals.stop = true;
Threads[0].wake_up(); // In case is waiting for stop or ponderhit
+ Threads.wait_end_of_search(); // Block here until search finishes
}
else if (cmd == "ponderhit")