]> git.sesse.net Git - stockfish/blobdiff - src/search.cpp
Fix subtle race with slave allocation
[stockfish] / src / search.cpp
index 479710784021fc2e3daee473309d5ca20b897ce9..49a7b4da8883ddcd76cebcde2e15bab6a15b32ae 100644 (file)
@@ -1282,12 +1282,7 @@ split_point_start: // At split points actual search starts from here
           && !pos.is_capture_or_promotion(move)
           &&  ss->eval + PawnValueMidgame / 4 < beta
           && !check_is_dangerous(pos, move, futilityBase, beta, &bestValue))
-      {
-          if (ss->eval + PawnValueMidgame / 4 > bestValue)
-              bestValue = ss->eval + PawnValueMidgame / 4;
-
           continue;
-      }
 
       // Check for legality only before to do the move
       if (!pos.pl_move_is_legal(move, ci.pinned))
@@ -1869,9 +1864,14 @@ void Thread::idle_loop(SplitPoint* sp_master) {
       {
           assert(!do_sleep && !do_exit);
 
-          // Copy split point position and search stack and call search()
-          Stack ss[MAX_PLY_PLUS_2];
+          lock_grab(Threads.splitLock);
+
+          assert(is_searching);
           SplitPoint* sp = splitPoint;
+
+          lock_release(Threads.splitLock);
+
+          Stack ss[MAX_PLY_PLUS_2];
           Position pos(*sp->pos, threadID);
 
           memcpy(ss, sp->ss - 1, 4 * sizeof(Stack));
@@ -1890,12 +1890,9 @@ void Thread::idle_loop(SplitPoint* sp_master) {
 
           assert(is_searching);
 
-          // We return from search with lock held
+          is_searching = false;
           sp->slavesMask &= ~(1ULL << threadID);
           sp->nodes += pos.nodes_searched();
-          lock_release(sp->lock);
-
-          is_searching = false;
 
           // Wake up master thread so to allow it to return from the idle loop in
           // case we are the last slave of the split point.
@@ -1903,8 +1900,16 @@ void Thread::idle_loop(SplitPoint* sp_master) {
               && threadID != sp->master
               && !Threads[sp->master].is_searching)
               Threads[sp->master].wake_up();
+
+          // After releasing the lock we cannot access anymore any SplitPoint
+          // related data in a reliably way becuase it could have been released
+          // under our feet by the sp master.
+          lock_release(sp->lock);
       }
   }
+  // In helpful master concept a master can help only a sub-tree of its split
+  // point, and because here is all finished is not possible master is booked.
+  assert(!is_searching);
 }