]> git.sesse.net Git - stockfish/blobdiff - src/search.cpp
Fix race condition where idle_loop() gets called from Split()
[stockfish] / src / search.cpp
index 15f09bc92743de1cc2eab9fcdfabfd76a4cba82b..c5c5b94470fed9365831fea28427db4d4070d0e5 100644 (file)
@@ -442,11 +442,17 @@ namespace {
             if (Time::now() - SearchTime > (TimeMgr.available_time() * 62) / 100)
                 stop = true;
 
+            bool recapture =   pos.is_capture(RootMoves[0].pv[0])
+                            && pos.captured_piece_type()
+                            && SetupMoves->size()
+                            && to_sq(SetupMoves->back()) == to_sq(RootMoves[0].pv[0]);
+
             // Stop search early if one move seems to be much better than others
             if (    depth >= 12
                 && !stop
                 &&  PVSize == 1
-                && (   (bestMoveNeverChanged &&  pos.captured_piece_type())
+                && (   (bestMoveNeverChanged && recapture)
+                    || RootMoves.size() == 1
                     || Time::now() - SearchTime > (TimeMgr.available_time() * 40) / 100))
             {
                 Value rBeta = bestValue - 2 * PawnValueMg;
@@ -1616,7 +1622,7 @@ void Thread::idle_loop() {
 
   // Pointer 'this_sp' is not null only if we are called from split(), and not
   // at the thread creation. So it means we are the split point's master.
-  const SplitPoint* this_sp = splitPointsSize ? activeSplitPoint : NULL;
+  SplitPoint* this_sp = splitPointsSize ? activeSplitPoint : NULL;
 
   assert(!this_sp || (this_sp->masterThread == this && searching));
 
@@ -1624,6 +1630,9 @@ void Thread::idle_loop() {
   // their work at this split point, return from the idle loop.
   while (!this_sp || this_sp->slavesMask)
   {
+      if (this_sp)
+          this_sp->mutex.unlock();
+
       // If we are not searching, wait for a condition to be signaled instead of
       // wasting CPU time polling for work.
       while ((!searching && Threads.sleepWhileIdle) || exit)
@@ -1715,6 +1724,9 @@ void Thread::idle_loop() {
           // unsafe because if we are exiting there is a chance are already freed.
           sp->mutex.unlock();
       }
+
+      if(this_sp)
+          this_sp->mutex.lock();
   }
 }