Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 8 additions & 9 deletions src/search.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -227,10 +227,9 @@ void MainThread::search() {
// Threads.stop. However, if we are pondering or in an infinite search,
// the UCI protocol states that we shouldn't print the best move before the
// GUI sends a "stop" or "ponderhit" command. We therefore simply wait here
// until the GUI sends one of those commands (which also raises Threads.stop).
Threads.stopOnPonderhit = true;
// until the GUI sends one of those commands.

while (!Threads.stop && (Threads.ponder || Limits.infinite))
while (!Threads.stop && (ponder || Limits.infinite))
{} // Busy wait for a stop or a ponder reset

// Stop the threads if not already stopped (also raise the stop if
Expand Down Expand Up @@ -448,7 +447,7 @@ void Thread::search() {
{
failedHighCnt = 0;
failedLow = true;
Threads.stopOnPonderhit = false;
mainThread->stopOnPonderhit = false;
}
}
else if (bestValue >= beta)
Expand Down Expand Up @@ -497,7 +496,7 @@ void Thread::search() {
// Do we have time for the next iteration? Can we stop searching now?
if ( Limits.use_time_management()
&& !Threads.stop
&& !Threads.stopOnPonderhit)
&& !mainThread->stopOnPonderhit)
{
double fallingEval = (306 + 119 * failedLow + 6 * (mainThread->previousScore - bestValue)) / 581.0;
fallingEval = std::max(0.5, std::min(1.5, fallingEval));
Expand All @@ -515,8 +514,8 @@ void Thread::search() {
{
// If we are allowed to ponder do not stop the search now but
// keep pondering until the GUI sends "ponderhit" or "stop".
if (Threads.ponder)
Threads.stopOnPonderhit = true;
if (mainThread->ponder)
mainThread->stopOnPonderhit = true;
else
Threads.stop = true;
}
Expand Down Expand Up @@ -1595,10 +1594,10 @@ void MainThread::check_time() {
}

// We should not stop pondering until told so by the GUI
if (Threads.ponder)
if (ponder)
return;

if ( (Limits.use_time_management() && elapsed > Time.maximum() - 10)
if ( (Limits.use_time_management() && (elapsed > Time.maximum() - 10 || stopOnPonderhit))
|| (Limits.movetime && elapsed >= Limits.movetime)
|| (Limits.nodes && Threads.nodes_searched() >= (uint64_t)Limits.nodes))
Threads.stop = true;
Expand Down
4 changes: 2 additions & 2 deletions src/thread.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -162,8 +162,8 @@ void ThreadPool::start_thinking(Position& pos, StateListPtr& states,

main()->wait_for_search_finished();

stopOnPonderhit = stop = false;
ponder = ponderMode;
main()->stopOnPonderhit = stop = false;
main()->ponder = ponderMode;
Search::Limits = limits;
Search::RootMoves rootMoves;

Expand Down
4 changes: 3 additions & 1 deletion src/thread.h
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,8 @@ struct MainThread : public Thread {
double bestMoveChanges, previousTimeReduction;
Value previousScore;
int callsCnt;
bool stopOnPonderhit;
std::atomic_bool ponder;
};


Expand All @@ -105,7 +107,7 @@ struct ThreadPool : public std::vector<Thread*> {
uint64_t nodes_searched() const { return accumulate(&Thread::nodes); }
uint64_t tb_hits() const { return accumulate(&Thread::tbHits); }

std::atomic_bool stop, ponder, stopOnPonderhit;
std::atomic_bool stop;

private:
StateListPtr setupStates;
Expand Down
14 changes: 6 additions & 8 deletions src/uci.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -207,18 +207,16 @@ void UCI::loop(int argc, char* argv[]) {
token.clear(); // Avoid a stale if getline() returns empty or blank line
is >> skipws >> token;

// The GUI sends 'ponderhit' to tell us the user has played the expected move.
// So 'ponderhit' will be sent if we were told to ponder on the same move the
// user has played. We should continue searching but switch from pondering to
// normal search. In case Threads.stopOnPonderhit is set we are waiting for
// 'ponderhit' to stop the search, for instance if max search depth is reached.
if ( token == "quit"
|| token == "stop"
|| (token == "ponderhit" && Threads.stopOnPonderhit))
|| token == "stop")
Threads.stop = true;

// The GUI sends 'ponderhit' to tell us the user has played the expected move.
// So 'ponderhit' will be sent if we were told to ponder on the same move the
// user has played. We should continue searching but switch from pondering to
// normal search.
else if (token == "ponderhit")
Threads.ponder = false; // Switch to normal search
Threads.main()->ponder = false; // Switch to normal search

else if (token == "uci")
sync_cout << "id name " << engine_info(true)
Expand Down