mirror of
https://github.com/sockspls/badfish
synced 2025-04-30 00:33:09 +00:00
Simplify locking
Retire slavesMask. We don't need it. It si enough 'searching' and 'thinking' flags. Further simplification is still possible, perhaps we could use a single flag. No functional change.
This commit is contained in:
parent
32d2c4e12b
commit
9c587288da
3 changed files with 20 additions and 22 deletions
|
@ -291,12 +291,13 @@ void Search::think() {
|
||||||
{
|
{
|
||||||
th->maxPly = 0;
|
th->maxPly = 0;
|
||||||
th->depth = DEPTH_ZERO;
|
th->depth = DEPTH_ZERO;
|
||||||
|
th->searching = true;
|
||||||
if (th != Threads.main())
|
if (th != Threads.main())
|
||||||
{
|
{
|
||||||
th->pos = Position(rootPos, th);
|
th->pos = Position(rootPos, th);
|
||||||
th->rootMoves = rootMoves;
|
th->rootMoves = rootMoves;
|
||||||
|
th->notify_one(); // Wake up the thread and start searching
|
||||||
}
|
}
|
||||||
th->notify_one(); // Wake up all the threads
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Threads.timer->run = true;
|
Threads.timer->run = true;
|
||||||
|
@ -306,10 +307,6 @@ void Search::think() {
|
||||||
|
|
||||||
TT.new_search();
|
TT.new_search();
|
||||||
|
|
||||||
// Start the threads
|
|
||||||
for (Thread* th : Threads)
|
|
||||||
th->searching = true;
|
|
||||||
|
|
||||||
Threads.main()->search();
|
Threads.main()->search();
|
||||||
|
|
||||||
// Stop the threads and timer
|
// Stop the threads and timer
|
||||||
|
@ -317,7 +314,9 @@ void Search::think() {
|
||||||
Threads.timer->run = false;
|
Threads.timer->run = false;
|
||||||
|
|
||||||
// Wait until all threads have finished
|
// Wait until all threads have finished
|
||||||
while (Threads.main()->slavesMask != 0) {}
|
for (Thread* th : Threads)
|
||||||
|
if (th != Threads.main())
|
||||||
|
th->wait_while(th->searching);
|
||||||
|
|
||||||
// Clear any candidate easy move that wasn't stable for the last search
|
// Clear any candidate easy move that wasn't stable for the last search
|
||||||
// iterations; the second condition prevents consecutive fast moves.
|
// iterations; the second condition prevents consecutive fast moves.
|
||||||
|
@ -346,7 +345,7 @@ void Search::think() {
|
||||||
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(Signals.stop);
|
Threads.main()->wait_for(Signals.stop);
|
||||||
}
|
}
|
||||||
|
|
||||||
sync_cout << "bestmove " << UCI::move(rootMoves[0].pv[0], rootPos.is_chess960());
|
sync_cout << "bestmove " << UCI::move(rootMoves[0].pv[0], rootPos.is_chess960());
|
||||||
|
@ -364,10 +363,6 @@ void Search::think() {
|
||||||
|
|
||||||
void Thread::search() {
|
void Thread::search() {
|
||||||
|
|
||||||
Threads.main()->mutex.lock();
|
|
||||||
Threads.main()->slavesMask.set(idx);
|
|
||||||
Threads.main()->mutex.unlock();
|
|
||||||
|
|
||||||
Value bestValue, alpha, beta, delta;
|
Value bestValue, alpha, beta, delta;
|
||||||
|
|
||||||
Move easyMove = MOVE_NONE;
|
Move easyMove = MOVE_NONE;
|
||||||
|
@ -560,10 +555,7 @@ void Thread::search() {
|
||||||
}
|
}
|
||||||
|
|
||||||
searching = false;
|
searching = false;
|
||||||
|
notify_one(); // Wake up main if is sleeping waiting for us
|
||||||
Threads.main()->mutex.lock();
|
|
||||||
Threads.main()->slavesMask.reset(idx);
|
|
||||||
Threads.main()->mutex.unlock();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -75,6 +75,15 @@ void ThreadBase::wait_for(volatile const bool& condition) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ThreadBase::wait_while() set the thread to sleep until 'condition' turns false
|
||||||
|
|
||||||
|
void ThreadBase::wait_while(volatile const bool& condition) {
|
||||||
|
|
||||||
|
std::unique_lock<Mutex> lk(mutex);
|
||||||
|
sleepCondition.wait(lk, [&]{ return !condition; });
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Thread c'tor makes some init but does not launch any execution thread that
|
// Thread c'tor makes some init but does not launch any execution thread that
|
||||||
// will be started only when c'tor returns.
|
// will be started only when c'tor returns.
|
||||||
|
|
||||||
|
@ -112,10 +121,6 @@ void Thread::idle_loop() {
|
||||||
|
|
||||||
while (!exit)
|
while (!exit)
|
||||||
{
|
{
|
||||||
// If this thread has been assigned work, launch a search
|
|
||||||
if (searching)
|
|
||||||
this->search();
|
|
||||||
|
|
||||||
// If search is finished then sleep
|
// If search is finished then sleep
|
||||||
if (!Threads.main()->thinking)
|
if (!Threads.main()->thinking)
|
||||||
{
|
{
|
||||||
|
@ -123,6 +128,9 @@ void Thread::idle_loop() {
|
||||||
while (!exit && !Threads.main()->thinking)
|
while (!exit && !Threads.main()->thinking)
|
||||||
sleepCondition.wait(lk);
|
sleepCondition.wait(lk);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!exit && searching)
|
||||||
|
this->search();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -147,11 +155,9 @@ void MainThread::idle_loop() {
|
||||||
lk.unlock();
|
lk.unlock();
|
||||||
|
|
||||||
if (!exit)
|
if (!exit)
|
||||||
{
|
|
||||||
Search::think();
|
Search::think();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// MainThread::join() waits for main thread to finish the search
|
// MainThread::join() waits for main thread to finish the search
|
||||||
|
|
|
@ -48,6 +48,7 @@ struct ThreadBase : public std::thread {
|
||||||
virtual void idle_loop() = 0;
|
virtual void idle_loop() = 0;
|
||||||
void notify_one();
|
void notify_one();
|
||||||
void wait_for(volatile const bool& b);
|
void wait_for(volatile const bool& b);
|
||||||
|
void wait_while(volatile const bool& b);
|
||||||
|
|
||||||
Mutex mutex;
|
Mutex mutex;
|
||||||
ConditionVariable sleepCondition;
|
ConditionVariable sleepCondition;
|
||||||
|
@ -89,7 +90,6 @@ struct MainThread : public Thread {
|
||||||
virtual void idle_loop();
|
virtual void idle_loop();
|
||||||
void join();
|
void join();
|
||||||
volatile bool thinking = true; // Avoid a race with start_thinking()
|
volatile bool thinking = true; // Avoid a race with start_thinking()
|
||||||
std::bitset<MAX_THREADS> slavesMask;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct TimerThread : public ThreadBase {
|
struct TimerThread : public ThreadBase {
|
||||||
|
|
Loading…
Add table
Reference in a new issue