From: Marco Costalba Date: Tue, 10 Apr 2012 18:48:57 +0000 (+0100) Subject: Don't reparent if a cutoff is pending X-Git-Url: https://git.sesse.net/?p=stockfish;a=commitdiff_plain;h=c645aca199ac7db2ffcfc229b3cda8dafa6fb835 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 --- diff --git a/src/search.cpp b/src/search.cpp index ad3898c1..dd3030a0 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -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 @@ -1901,7 +1898,6 @@ void Thread::idle_loop(SplitPoint* sp_master) { break; // Exit anyhow, only one try (enough in 99% of cases) } } - } } } } diff --git a/src/thread.cpp b/src/thread.cpp index 6d07ec35..a644cae9 100644 --- a/src/thread.cpp +++ b/src/thread.cpp @@ -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);