int MultiPV, UCIMultiPV, MultiPVIdx;
// Time management variables
- bool StopOnPonderhit, FirstRootMove, StopRequest, QuitRequest, AspirationFailLow;
+ volatile bool StopOnPonderhit, FirstRootMove, StopRequest, QuitRequest, AspirationFailLow;
TimeManager TimeMgr;
SearchLimits Limits;
pos.undo_move(bestMove); // Return from think() with unchanged position
}
- // If we are pondering or in infinite search, we shouldn't print the best move
+ // When we reach max depth we arrive here even without a StopRequest, but if
+ // we are pondering or in infinite search, we shouldn't print the best move
// before we are told to do so.
- if (Limits.ponder || Limits.infinite)
+ if (!StopRequest && (Limits.ponder || Limits.infinite))
wait_for_stop_or_ponderhit();
// Could be MOVE_NONE when searching on a stalemate position
if (depth > 2 && bestMoveChanges[depth])
bestMoveNeverChanged = false;
- // Check for some early stop condition
- if (!StopRequest && Limits.useTimeManagement())
+ // Do we have time for the next iteration? Can we stop searching now?
+ if (!StopRequest && !StopOnPonderhit && Limits.useTimeManagement())
{
// Take in account some extra time if the best move has changed
if (depth > 4 && depth < 50)
}
// If we are allowed to ponder do not stop the search now but keep pondering
- if (StopRequest && Limits.ponder)
+ if (StopRequest && Limits.ponder) // FIXME Limits.ponder is racy
{
StopRequest = false;
StopOnPonderhit = true;