mirror of
https://github.com/sockspls/badfish
synced 2025-04-30 16:53:09 +00:00
Retire Threads wake_up() and sleep()
These functions are used in just one place. And generalize wait_for_stop() No functional change.
This commit is contained in:
parent
81cd7d787e
commit
ea6c1f7a17
3 changed files with 23 additions and 44 deletions
|
@ -227,7 +227,15 @@ void Search::think() {
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
Threads.wake_up();
|
// Reset and wake up the threads
|
||||||
|
for (size_t i = 0; i < Threads.size(); i++)
|
||||||
|
{
|
||||||
|
Threads[i].maxPly = 0;
|
||||||
|
Threads[i].do_sleep = false;
|
||||||
|
|
||||||
|
if (!Threads.use_sleeping_threads())
|
||||||
|
Threads[i].notify_one();
|
||||||
|
}
|
||||||
|
|
||||||
// Set best timer interval to avoid lagging under time pressure. Timer is
|
// 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.
|
||||||
|
@ -242,7 +250,11 @@ void Search::think() {
|
||||||
id_loop(RootPos); // Let's start searching !
|
id_loop(RootPos); // Let's start searching !
|
||||||
|
|
||||||
Threads.set_timer(0); // Stop timer
|
Threads.set_timer(0); // Stop timer
|
||||||
Threads.sleep();
|
|
||||||
|
// Main thread will go to sleep by itself to avoid a race with start_searching()
|
||||||
|
for (size_t i = 0; i < Threads.size(); i++)
|
||||||
|
if (&Threads[i] != Threads.main_thread())
|
||||||
|
Threads[i].do_sleep = true;
|
||||||
|
|
||||||
if (Options["Use Search Log"])
|
if (Options["Use Search Log"])
|
||||||
{
|
{
|
||||||
|
@ -262,12 +274,14 @@ void Search::think() {
|
||||||
finalize:
|
finalize:
|
||||||
|
|
||||||
// When we reach max depth we arrive here even without Signals.stop is raised,
|
// When we reach max depth we arrive here even without Signals.stop is raised,
|
||||||
// but if we are pondering or in infinite search, we shouldn't print the best
|
// but if we are pondering or in infinite search, according to UCI protocol,
|
||||||
// move before we are told to do so.
|
// we shouldn't print the best move before the GUI sends a "stop" or "ponderhit"
|
||||||
|
// command. We simply wait here until GUI sends one of those commands (that
|
||||||
|
// raise Signals.stop).
|
||||||
if (!Signals.stop && (Limits.ponder || Limits.infinite))
|
if (!Signals.stop && (Limits.ponder || Limits.infinite))
|
||||||
{
|
{
|
||||||
Signals.stopOnPonderhit = true;
|
Signals.stopOnPonderhit = true;
|
||||||
RootPos.this_thread()->wait_for_stop();
|
RootPos.this_thread()->wait_for(Signals.stop);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Best move could be MOVE_NONE when searching on a stalemate position
|
// Best move could be MOVE_NONE when searching on a stalemate position
|
||||||
|
|
|
@ -131,17 +131,12 @@ void Thread::notify_one() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Thread::wait_for_stop() is called when the maximum depth is reached while
|
// Thread::wait_for() set the thread to sleep until condition 'b' turns true
|
||||||
// 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 Signals.stop) is sent and
|
|
||||||
// then return, after which the bestmove and pondermove will be printed.
|
|
||||||
|
|
||||||
void Thread::wait_for_stop() {
|
void Thread::wait_for(volatile const bool& b) {
|
||||||
|
|
||||||
mutex.lock();
|
mutex.lock();
|
||||||
while (!Signals.stop) sleepCondition.wait(mutex);
|
while (!b) sleepCondition.wait(mutex);
|
||||||
mutex.unlock();
|
mutex.unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -230,34 +225,6 @@ void ThreadPool::read_uci_options() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// wake_up() is called before a new search to start the threads that are waiting
|
|
||||||
// on the sleep condition and to reset maxPly. When useSleepingThreads is set
|
|
||||||
// threads will be woken up at split time.
|
|
||||||
|
|
||||||
void ThreadPool::wake_up() const {
|
|
||||||
|
|
||||||
for (size_t i = 0; i < threads.size(); i++)
|
|
||||||
{
|
|
||||||
threads[i]->maxPly = 0;
|
|
||||||
threads[i]->do_sleep = false;
|
|
||||||
|
|
||||||
if (!useSleepingThreads)
|
|
||||||
threads[i]->notify_one();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// sleep() is called after the search finishes to ask all the threads but the
|
|
||||||
// main one to go waiting on a sleep condition.
|
|
||||||
|
|
||||||
void ThreadPool::sleep() const {
|
|
||||||
|
|
||||||
// Main thread will go to sleep by itself to avoid a race with start_searching()
|
|
||||||
for (size_t i = 1; i < threads.size(); i++)
|
|
||||||
threads[i]->do_sleep = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// available_slave_exists() tries to find an idle thread which is available as
|
// available_slave_exists() tries to find an idle thread which is available as
|
||||||
// a slave for the thread 'master'.
|
// a slave for the thread 'master'.
|
||||||
|
|
||||||
|
|
|
@ -105,7 +105,7 @@ public:
|
||||||
void idle_loop();
|
void idle_loop();
|
||||||
void main_loop();
|
void main_loop();
|
||||||
void timer_loop();
|
void timer_loop();
|
||||||
void wait_for_stop();
|
void wait_for(volatile const bool& b);
|
||||||
|
|
||||||
SplitPoint splitPoints[MAX_SPLITPOINTS_PER_THREAD];
|
SplitPoint splitPoints[MAX_SPLITPOINTS_PER_THREAD];
|
||||||
Material::Table materialTable;
|
Material::Table materialTable;
|
||||||
|
@ -141,8 +141,6 @@ public:
|
||||||
size_t size() const { return threads.size(); }
|
size_t size() const { return threads.size(); }
|
||||||
Thread* main_thread() { return threads[0]; }
|
Thread* main_thread() { return threads[0]; }
|
||||||
|
|
||||||
void wake_up() const;
|
|
||||||
void sleep() const;
|
|
||||||
void read_uci_options();
|
void read_uci_options();
|
||||||
bool available_slave_exists(Thread* master) const;
|
bool available_slave_exists(Thread* master) const;
|
||||||
void set_timer(int msec);
|
void set_timer(int msec);
|
||||||
|
|
Loading…
Add table
Reference in a new issue