From: Marco Costalba Date: Tue, 10 Sep 2013 19:14:09 +0000 (+0200) Subject: Fix random moves when time < 10ms X-Git-Url: https://git.sesse.net/?p=stockfish;a=commitdiff_plain;h=49e110c52b19f5c99954d4797b8e991b0b60007c;ds=sidebyside Fix random moves when time < 10ms In case we have less then 10ms to think as soon as we wake up the timer, it immediately fires and calls check_time() where due to condition: elapsed > TimeMgr.maximum_time() - 2 * TimerResolution the stop flag is set and search returns immediately, without actually search anything. Here the somewhat hacky fix is to start the timer after at least one iteration as been completed. No functional change. --- diff --git a/src/search.cpp b/src/search.cpp index 24f1e624..4b0a9fe8 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -242,13 +242,11 @@ void Search::think() { Threads.sleepWhileIdle = Options["Idle Threads Sleep"]; // Set best timer interval to avoid lagging under time pressure. Timer is - // used to check for remaining available thinking time. + // used to check for remaining available thinking time. Timer will be started + // at the end of first iteration to avoid returning with a random move. Threads.timer->msec = Limits.use_time_management() ? std::min(100, std::max(TimeMgr.available_time() / 16, TimerResolution)) : - Limits.nodes ? 2 * TimerResolution - : 100; - - Threads.timer->notify_one(); // Wake up the recurring timer + Limits.nodes ? 2 * TimerResolution : 100; id_loop(RootPos); // Let's start searching ! @@ -402,6 +400,10 @@ namespace { assert(alpha >= -VALUE_INFINITE && beta <= VALUE_INFINITE); } + // Wake up the recurring timer after first iteration is finished + if (depth == 1) + Threads.timer->notify_one(); + // Sort the PV lines searched so far and update the GUI std::stable_sort(RootMoves.begin(), RootMoves.begin() + PVIdx + 1);