summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
66c5eae)
In this rare case (e.g. go infinite on a stalemate),
just spin till ponderhit/stop comes.
The Thread::wait() is a renmant of the old YBWC
code, today with lazy SMP, threads don't need to
wait when outside of their idle loop.
No functional change.
// 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).
// 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).
- if (!Threads.stop && (Threads.ponder || Limits.infinite))
- {
- Threads.stopOnPonderhit = true;
- wait(Threads.stop);
- }
+ Threads.stopOnPonderhit = true;
+
+ while (!Threads.stop && (Threads.ponder || Limits.infinite))
+ {} // Busy wait for a stop or a ponder reset
- // Stop the threads if not already stopped
+ // Stop the threads if not already stopped (also raise the stop if
+ // "ponderhit" just reset Threads.ponder).
Threads.stop = true;
// Wait until all threads have finished
Threads.stop = true;
// Wait until all threads have finished
-/// Thread::wait() waits on sleep condition until condition is true
-
-void Thread::wait(std::atomic_bool& condition) {
-
- std::unique_lock<Mutex> lk(mutex);
- sleepCondition.wait(lk, [&]{ return bool(condition); });
-}
-
-
/// Thread::start_searching() wakes up the thread that will start the search
/// Thread::start_searching() wakes up the thread that will start the search
-void Thread::start_searching(bool resume) {
+void Thread::start_searching() {
std::unique_lock<Mutex> lk(mutex);
std::unique_lock<Mutex> lk(mutex);
-
- if (!resume)
- searching = true;
-
sleepCondition.notify_one();
}
sleepCondition.notify_one();
}
virtual ~Thread();
virtual void search();
void idle_loop();
virtual ~Thread();
virtual void search();
void idle_loop();
- void start_searching(bool resume = false);
+ void start_searching();
void wait_for_search_finished();
void wait_for_search_finished();
- void wait(std::atomic_bool& condition);
Pawns::Table pawnsTable;
Material::Table materialTable;
Pawns::Table pawnsTable;
Material::Table materialTable;
if ( token == "quit"
|| token == "stop"
|| (token == "ponderhit" && Threads.stopOnPonderhit))
if ( token == "quit"
|| token == "stop"
|| (token == "ponderhit" && Threads.stopOnPonderhit))
- Threads.main()->start_searching(true); // Could be sleeping
- }
else if (token == "ponderhit")
Threads.ponder = false; // Switch to normal search
else if (token == "ponderhit")
Threads.ponder = false; // Switch to normal search