X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fthread.cpp;h=2978f188b6878be190a4c2b366e509489ac27a99;hp=57faa6e90bb39b53ccff0a3cf3f5c6e84ef6f225;hb=c4517c013cf8cf1a388c94d90727dbe08938cc5a;hpb=ed04c010eb4a569532f322f5030d468380b3ab57 diff --git a/src/thread.cpp b/src/thread.cpp index 57faa6e9..2978f188 100644 --- a/src/thread.cpp +++ b/src/thread.cpp @@ -418,7 +418,7 @@ void Thread::main_loop() { if (do_terminate) return; - think(); // Search entry point + Search::think(); } } @@ -446,3 +446,25 @@ void ThreadsManager::start_thinking(bool asyncMode) { lock_release(&main.sleepLock); } + + +// ThreadsManager::wait_for_stop_or_ponderhit() is called when the maximum depth +// is reached while the program is pondering. The point is to work around a wrinkle +// in the UCI protocol: When pondering, the engine is not allowed to give a +// "bestmove" before the GUI sends it a "stop" or "ponderhit" command. +// We simply wait here until one of these commands (that raise StopRequest) is +// sent, and return, after which the bestmove and pondermove will be printed. + +void ThreadsManager::wait_for_stop_or_ponderhit() { + + Search::Signals.stopOnPonderhit = true; + + Thread& main = threads[0]; + + lock_grab(&main.sleepLock); + + while (!Search::Signals.stop) + cond_wait(&main.sleepCond, &main.sleepLock); + + lock_release(&main.sleepLock); +}