X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fsearch.cpp;h=21d5d786b6ba8be9e558bca2ffb18dfd78c951f1;hp=08a157c2c793235c7977063ad29bc5118cd19e40;hb=ce159b16b9483f83b9e96ac6bf3d6e2ba7e5619c;hpb=f59323b56a0920676c2589a36356a44fc42c8f40 diff --git a/src/search.cpp b/src/search.cpp index 08a157c2..21d5d786 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -1844,6 +1844,7 @@ void Thread::idle_loop(SplitPoint* sp_master) { assert(is_searching); is_searching = false; + sp->allSlavesRunning = false; sp->slavesMask &= ~(1ULL << idx); sp->nodes += pos.nodes_searched(); @@ -1860,20 +1861,19 @@ void Thread::idle_loop(SplitPoint* sp_master) { // unsafe because if we are exiting there is a chance are already freed. lock_release(sp->lock); - // Try to reparent to another split point + // Try to reparent to the first split point, with still all slaves + // running, where we are available as a possible slave. for (int i = 0; i < Threads.size(); i++) { Thread* th = &Threads[i]; int spCnt = th->splitPointsCnt; SplitPoint* latest = &th->splitPoints[spCnt ? spCnt - 1 : 0]; - // Find the first split point with still all slaves running - // where we are available as a possible slave. if ( this->is_available_to(th) && spCnt > 0 - && !latest->cutoff - && latest->slavesMask == latest->allSlavesMask - && more_than_one(latest->allSlavesMask)) + && !th->cutoff_occurred() + && latest->allSlavesRunning + && more_than_one(latest->slavesMask)) { lock_grab(latest->lock); lock_grab(Threads.splitLock); @@ -1882,11 +1882,11 @@ void Thread::idle_loop(SplitPoint* sp_master) { // of a race storm here ! if ( this->is_available_to(th) && spCnt == th->splitPointsCnt - && !latest->cutoff - && latest->slavesMask == latest->allSlavesMask - && more_than_one(latest->allSlavesMask)) + && !th->cutoff_occurred() + && latest->allSlavesRunning + && more_than_one(latest->slavesMask)) { - latest->slavesMask |= 1ULL << idx; // allSlavesMask is not updated + latest->slavesMask |= 1ULL << idx; curSplitPoint = latest; is_searching = true; }