Don't reparent if a cutoff is pending
authorMarco Costalba <mcostalba@gmail.com>
Tue, 10 Apr 2012 18:48:57 +0000 (19:48 +0100)
committerMarco Costalba <mcostalba@gmail.com>
Thu, 12 Apr 2012 20:17:52 +0000 (21:17 +0100)
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>
src/search.cpp
src/thread.cpp

index ad3898c14af9cbe3faf7727ddb4146661691e0b8..dd3030a0dd4f1390b0ef8b1043ff70bfa73afb19 100644 (file)
@@ -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)
                   }
               }
-          }
       }
   }
 }
index 6d07ec35f3e29d1e83295c7417481dac7c9ffead..a644cae9b64ede6d5a1e682cd62f5aff9b4e01af 100644 (file)
@@ -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);