]> git.sesse.net Git - stockfish/blobdiff - src/search.cpp
Pass moveCount by value in split()
[stockfish] / src / search.cpp
index 93243ed7488ad512872fc22b6a874c23de49f9a2..9d1fe0173ed7500cbe0d1e2bc9216454d8b6696d 100644 (file)
@@ -88,7 +88,7 @@ namespace {
 
     template <bool Fake>
     void split(const Position& pos, SearchStack* ss, int ply, Value* alpha, const Value beta, Value* bestValue,
-               Depth depth, Move threatMove, bool mateThreat, int* moveCount, MovePicker* mp, bool pvNode);
+               Depth depth, Move threatMove, bool mateThreat, int moveCount, MovePicker* mp, bool pvNode);
 
   private:
     friend void poll();
@@ -1342,7 +1342,7 @@ namespace {
           && !ThreadsMgr.thread_should_stop(threadID)
           && Iteration <= 99)
           ThreadsMgr.split<FakeSplit>(pos, ss, ply, &alpha, beta, &bestValue, depth,
-                                      threatMove, mateThreat, &moveCount, &mp, PvNode);
+                                      threatMove, mateThreat, moveCount, &mp, PvNode);
     }
 
     // Step 19. Check for mate and stalemate
@@ -1692,13 +1692,12 @@ namespace {
       if (value > sp->bestValue && !ThreadsMgr.thread_should_stop(threadID))
       {
           sp->bestValue = value;
-
-          if (sp->bestValue > sp->alpha)
+          if (value > sp->alpha)
           {
               if (!PvNode || value >= sp->beta)
                   sp->stopRequest = true;
 
-              if (PvNode && value < sp->beta) // This guarantees that always: sp->alpha < sp->beta
+              if (PvNode && value < sp->beta) // We want always sp->alpha < sp->beta
                   sp->alpha = value;
 
               sp->parentSstack->bestMove = ss->bestMove = move;
@@ -2463,13 +2462,11 @@ namespace {
 
   void ThreadsManager::exit_threads() {
 
-    ActiveThreads = MAX_THREADS;  // HACK
-    AllThreadsShouldSleep = true;  // HACK
+    ActiveThreads = MAX_THREADS;  // Wake up all the threads
+    AllThreadsShouldExit = true;  // Let the woken up threads to exit idle_loop()
+    AllThreadsShouldSleep = true; // Avoid an assert in wake_sleeping_threads()
     wake_sleeping_threads();
 
-    // This makes the threads to exit idle_loop()
-    AllThreadsShouldExit = true;
-
     // Wait for thread termination
     for (int i = 1; i < MAX_THREADS; i++)
         while (threads[i].state != THREAD_TERMINATED) {}
@@ -2492,9 +2489,9 @@ namespace {
 
     assert(threadID >= 0 && threadID < ActiveThreads);
 
-    SplitPoint* sp;
+    SplitPoint* sp = threads[threadID].splitPoint;
 
-    for (sp = threads[threadID].splitPoint; sp && !sp->stopRequest; sp = sp->parent) {}
+    for ( ; sp && !sp->stopRequest; sp = sp->parent) {}
     return sp != NULL;
   }
 
@@ -2519,12 +2516,9 @@ namespace {
     // Make a local copy to be sure doesn't change under our feet
     int localActiveSplitPoints = threads[slave].activeSplitPoints;
 
-    if (localActiveSplitPoints == 0)
-        // No active split points means that the thread is available as
-        // a slave for any other thread.
-        return true;
-
-    if (ActiveThreads == 2)
+    // No active split points means that the thread is available as
+    // a slave for any other thread.
+    if (localActiveSplitPoints == 0 || ActiveThreads == 2)
         return true;
 
     // Apply the "helpful master" concept if possible. Use localActiveSplitPoints
@@ -2566,7 +2560,7 @@ namespace {
   template <bool Fake>
   void ThreadsManager::split(const Position& p, SearchStack* ss, int ply, Value* alpha,
                              const Value beta, Value* bestValue, Depth depth, Move threatMove,
-                             bool mateThreat, int* moveCount, MovePicker* mp, bool pvNode) {
+                             bool mateThreat, int moveCount, MovePicker* mp, bool pvNode) {
     assert(p.is_ok());
     assert(ply > 0 && ply < PLY_MAX);
     assert(*bestValue >= -VALUE_INFINITE);
@@ -2606,7 +2600,7 @@ namespace {
     splitPoint.pvNode = pvNode;
     splitPoint.bestValue = *bestValue;
     splitPoint.mp = mp;
-    splitPoint.moveCount = *moveCount;
+    splitPoint.moveCount = moveCount;
     splitPoint.pos = &p;
     splitPoint.parentSstack = ss;
     for (i = 0; i < ActiveThreads; i++)