1
0
Fork 0

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>
sf_2.3.1_base
Marco Costalba 2012-04-10 19:48:57 +01:00
parent 44432f67d7
commit c645aca199
2 changed files with 17 additions and 19 deletions

View File

@ -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)
}
}
}
}
}
}

View File

@ -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);