mirror of
https://github.com/sockspls/badfish
synced 2025-05-01 09:13:08 +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,31 +1862,28 @@ void Thread::idle_loop(SplitPoint* sp_master) {
|
||||||
|
|
||||||
// Try to reparent to another split point. Only for slave threads
|
// Try to reparent to another split point. Only for slave threads
|
||||||
// that are not master of any active split point.
|
// that are not master of any active split point.
|
||||||
if ( !sp_master
|
if (!splitPointsCnt)
|
||||||
&& !is_searching
|
|
||||||
&& !do_sleep
|
|
||||||
&& !do_exit
|
|
||||||
&& !splitPointsCnt
|
|
||||||
&& Threads.size() > 2)
|
|
||||||
{
|
|
||||||
for (int i = 0; i < Threads.size(); i++)
|
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
|
// Find the first split point with still all slaves running
|
||||||
if ( Threads[i].splitPointsCnt
|
// where we are available as a possible slave.
|
||||||
|
if ( !is_searching
|
||||||
|
&& th->splitPointsCnt
|
||||||
|
&& !oldest->cutoff
|
||||||
&& oldest->slavesMask == oldest->allSlavesMask
|
&& oldest->slavesMask == oldest->allSlavesMask
|
||||||
&& !single_bit(oldest->allSlavesMask))
|
&& !single_bit(oldest->allSlavesMask))
|
||||||
{
|
{
|
||||||
lock_grab(oldest->lock);
|
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
|
// Retest all under lock protection, we are in the middle
|
||||||
// of a race storm !
|
// of a race storm here !
|
||||||
if ( !is_searching
|
if ( !is_searching
|
||||||
&& !do_sleep
|
&& th->splitPointsCnt
|
||||||
&& !do_exit
|
&& !oldest->cutoff
|
||||||
&& Threads[i].splitPointsCnt
|
|
||||||
&& oldest->slavesMask == oldest->allSlavesMask
|
&& oldest->slavesMask == oldest->allSlavesMask
|
||||||
&& !single_bit(oldest->allSlavesMask))
|
&& !single_bit(oldest->allSlavesMask))
|
||||||
{
|
{
|
||||||
|
@ -1904,7 +1901,6 @@ void Thread::idle_loop(SplitPoint* sp_master) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// check_time() is called by the timer thread when the timer triggers. It is
|
/// check_time() is called by the timer thread when the timer triggers. It is
|
||||||
|
|
|
@ -313,7 +313,7 @@ Value ThreadsManager::split(Position& pos, Stack* ss, Value alpha, Value beta,
|
||||||
return bestValue;
|
return bestValue;
|
||||||
|
|
||||||
// Pick the next available split point from the split point stack
|
// 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->parent = master->curSplitPoint;
|
||||||
sp->master = master;
|
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(splitLock);
|
||||||
lock_release(sp->lock);
|
lock_release(sp->lock);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue