mirror of
https://github.com/sockspls/badfish
synced 2025-04-30 16:53:09 +00:00
Don't reparent if a cutoff is pending
And update master->splitPointsCnt under lock protection. Not stricly necessary because single_bit() condition takes care of false positives anyhow, but it is a bit tricky and moving under lock is the most natural thing to do to avoid races with "reparenting". No functional change. Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
parent
44432f67d7
commit
c645aca199
2 changed files with 17 additions and 19 deletions
|
@ -1862,32 +1862,29 @@ void Thread::idle_loop(SplitPoint* sp_master) {
|
|||
|
||||
// Try to reparent to another split point. Only for slave threads
|
||||
// that are not master of any active split point.
|
||||
if ( !sp_master
|
||||
&& !is_searching
|
||||
&& !do_sleep
|
||||
&& !do_exit
|
||||
&& !splitPointsCnt
|
||||
&& Threads.size() > 2)
|
||||
{
|
||||
if (!splitPointsCnt)
|
||||
for (int i = 0; i < Threads.size(); i++)
|
||||
{
|
||||
SplitPoint* oldest = &Threads[i].splitPoints[0];
|
||||
Thread* th = &Threads[i];
|
||||
SplitPoint* oldest = &th->splitPoints[0];
|
||||
|
||||
// Find the first oldest split point with still all slaves running
|
||||
if ( Threads[i].splitPointsCnt
|
||||
&& oldest->slavesMask == oldest->allSlavesMask
|
||||
// Find the first split point with still all slaves running
|
||||
// where we are available as a possible slave.
|
||||
if ( !is_searching
|
||||
&& th->splitPointsCnt
|
||||
&& !oldest->cutoff
|
||||
&& oldest->slavesMask == oldest->allSlavesMask
|
||||
&& !single_bit(oldest->allSlavesMask))
|
||||
{
|
||||
lock_grab(oldest->lock);
|
||||
lock_grab(Threads.splitLock); // Needed by is_searching
|
||||
lock_grab(Threads.splitLock);
|
||||
|
||||
// Retest all under lock protection, we are in the middle
|
||||
// of a race storm !
|
||||
// of a race storm here !
|
||||
if ( !is_searching
|
||||
&& !do_sleep
|
||||
&& !do_exit
|
||||
&& Threads[i].splitPointsCnt
|
||||
&& oldest->slavesMask == oldest->allSlavesMask
|
||||
&& th->splitPointsCnt
|
||||
&& !oldest->cutoff
|
||||
&& oldest->slavesMask == oldest->allSlavesMask
|
||||
&& !single_bit(oldest->allSlavesMask))
|
||||
{
|
||||
oldest->slavesMask |= 1ULL << idx; // allSlavesMask is not updated
|
||||
|
@ -1901,7 +1898,6 @@ void Thread::idle_loop(SplitPoint* sp_master) {
|
|||
break; // Exit anyhow, only one try (enough in 99% of cases)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -313,7 +313,7 @@ Value ThreadsManager::split(Position& pos, Stack* ss, Value alpha, Value beta,
|
|||
return bestValue;
|
||||
|
||||
// Pick the next available split point from the split point stack
|
||||
SplitPoint* sp = &master->splitPoints[master->splitPointsCnt++];
|
||||
SplitPoint* sp = &master->splitPoints[master->splitPointsCnt];
|
||||
|
||||
sp->parent = master->curSplitPoint;
|
||||
sp->master = master;
|
||||
|
@ -362,6 +362,8 @@ Value ThreadsManager::split(Position& pos, Stack* ss, Value alpha, Value beta,
|
|||
}
|
||||
}
|
||||
|
||||
master->splitPointsCnt++;
|
||||
|
||||
lock_release(splitLock);
|
||||
lock_release(sp->lock);
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue