1
0
Fork 0
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:
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,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

View file

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