]> git.sesse.net Git - stockfish/blobdiff - src/search.cpp
Fix last leak detected by Valgrind
[stockfish] / src / search.cpp
index 29d022added67563087a207714086d02c45b50fe..6b943b53793ffc0ac9eefaf0e097a05a1af608da 100644 (file)
@@ -1174,7 +1174,7 @@ split_point_start: // At split points actual search starts from here
 
     // Initialize a MovePicker object for the current position
     // FIXME currently MovePicker() c'tor is needless called also in SplitPoint
-    MovePicker mpBase = MovePicker(pos, ttMove, depth, H, ss, (PvNode ? -VALUE_INFINITE : beta));
+    MovePicker mpBase(pos, ttMove, depth, H, ss, (PvNode ? -VALUE_INFINITE : beta));
     MovePicker& mp = SpNode ? *sp->mp : mpBase;
     CheckInfo ci(pos);
     ss->bestMove = MOVE_NONE;
@@ -1243,7 +1243,10 @@ split_point_start: // At split points actual search starts from here
       newDepth = depth - ONE_PLY + ext;
 
       // Update current move (this must be done after singular extension search)
-      movesSearched[moveCount++] = ss->currentMove = move;
+      movesSearched[moveCount] = ss->currentMove = move;
+
+      if (!SpNode)
+          moveCount++;
 
       // Step 12. Futility pruning (is omitted in PV nodes)
       if (   !PvNode
@@ -1364,24 +1367,29 @@ split_point_start: // At split points actual search starts from here
       if (value > bestValue && !(SpNode && ThreadsMgr.thread_should_stop(threadID)))
       {
           bestValue = value;
+
+          if (SpNode)
+              sp->bestValue = value;
+
           if (value > alpha)
           {
               if (SpNode && (!PvNode || value >= beta))
                   sp->stopRequest = true;
 
               if (PvNode && value < beta) // We want always alpha < beta
+              {
                   alpha = value;
+                  if (SpNode)
+                      sp->alpha = value;
+              }
 
               if (value == value_mate_in(ply + 1))
                   ss->mateKiller = move;
 
               ss->bestMove = move;
-          }
-          if (SpNode)
-          {
-              sp->bestValue = bestValue;
-              sp->alpha = alpha;
-              sp->parentSstack->bestMove = ss->bestMove;
+
+              if (SpNode)
+                  sp->parentSstack->bestMove = move;
           }
       }
 
@@ -2259,9 +2267,9 @@ split_point_start: // At split points actual search starts from here
 
             if (tsp->pvNode)
                 search<PV, true>(pos, ss, tsp->alpha, tsp->beta, tsp->depth, tsp->ply);
-            else
+            else {
                 search<NonPV, true>(pos, ss, tsp->alpha, tsp->beta, tsp->depth, tsp->ply);
-
+            }
             assert(threads[threadID].state == THREAD_SEARCHING);
 
             threads[threadID].state = THREAD_AVAILABLE;
@@ -2328,6 +2336,7 @@ split_point_start: // At split points actual search starts from here
 #if !defined(_MSC_VER)
         pthread_t pthread[1];
         ok = (pthread_create(pthread, NULL, init_thread, (void*)(&i)) == 0);
+        pthread_detach(pthread[0]);
 #else
         ok = (CreateThread(NULL, 0, init_thread, (LPVOID)(&i), 0, NULL) != NULL);
 #endif
@@ -2443,9 +2452,8 @@ split_point_start: // At split points actual search starts from here
   // split point objects), the function immediately returns. If splitting is
   // possible, a SplitPoint object is initialized with all the data that must be
   // copied to the helper threads and we tell our helper threads that they have
-  // been assigned work. This will cause them to instantly leave their idle loops
-  // and call sp_search(). When all threads have returned from sp_search() then
-  // split() returns.
+  // been assigned work. This will cause them to instantly leave their idle loops and
+  // call search().When all threads have returned from search() then split() returns.
 
   template <bool Fake>
   void ThreadsManager::split(const Position& p, SearchStack* ss, int ply, Value* alpha,