]> git.sesse.net Git - stockfish/blobdiff - src/search.cpp
Reparent to latest
[stockfish] / src / search.cpp
index ad3898c14af9cbe3faf7727ddb4146661691e0b8..b38b7bab92ef84df92eb625b3316b496280a8dcf 100644 (file)
@@ -1860,46 +1860,41 @@ 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. 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)
+          // Try to reparent to another split point
+          for (int i = 0; i < Threads.size(); i++)
           {
-              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
+                  && !single_bit(latest->allSlavesMask))
               {
-                  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
-                      && !single_bit(oldest->allSlavesMask))
+                  lock_grab(latest->lock);
+                  lock_grab(Threads.splitLock);
+
+                  // Retest all under lock protection, we are in the middle
+                  // of a race storm here !
+                  if (    this->is_available_to(th)
+                      &&  spCnt == th->splitPointsCnt
+                      && !latest->cutoff
+                      &&  latest->slavesMask == latest->allSlavesMask
+                      && !single_bit(latest->allSlavesMask))
                   {
-                      lock_grab(oldest->lock);
-                      lock_grab(Threads.splitLock); // Needed by is_searching
-
-                      // Retest all under lock protection, we are in the middle
-                      // of a race storm !
-                      if (   !is_searching
-                          && !do_sleep
-                          && !do_exit
-                          && Threads[i].splitPointsCnt
-                          && oldest->slavesMask == oldest->allSlavesMask
-                          && !single_bit(oldest->allSlavesMask))
-                      {
-                          oldest->slavesMask |= 1ULL << idx; // allSlavesMask is not updated
-                          curSplitPoint = oldest;
-                          is_searching = true;
-                      }
-
-                      lock_release(Threads.splitLock);
-                      lock_release(oldest->lock);
-
-                      break; // Exit anyhow, only one try (enough in 99% of cases)
+                      latest->slavesMask |= 1ULL << idx; // allSlavesMask is not updated
+                      curSplitPoint = latest;
+                      is_searching = true;
                   }
+
+                  lock_release(Threads.splitLock);
+                  lock_release(latest->lock);
+
+                  break; // Exit anyhow, only one try (enough in 99% of cases)
               }
           }
       }