Skip to content

Commit

Permalink
Don't reparent if a cutoff is pending
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
mcostalba committed Apr 12, 2012
1 parent 44432f6 commit c645aca
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 20 deletions.
34 changes: 15 additions & 19 deletions src/search.cpp
Expand Up @@ -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];

// Find the first oldest split point with still all slaves running
if ( Threads[i].splitPointsCnt
&& oldest->slavesMask == oldest->allSlavesMask
Thread* th = &Threads[i];
SplitPoint* oldest = &th->splitPoints[0];

// 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
Expand All @@ -1901,7 +1898,6 @@ void Thread::idle_loop(SplitPoint* sp_master) {
break; // Exit anyhow, only one try (enough in 99% of cases)
}
}
}
}
}
}
Expand Down
4 changes: 3 additions & 1 deletion src/thread.cpp
Expand Up @@ -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;
Expand Down Expand Up @@ -362,6 +362,8 @@ Value ThreadsManager::split(Position& pos, Stack* ss, Value alpha, Value beta,
}
}

master->splitPointsCnt++;

lock_release(splitLock);
lock_release(sp->lock);

Expand Down

0 comments on commit c645aca

Please sign in to comment.