X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=src%2Fsearch.cpp;h=63a8221a5c57b2408d7d1e5a5552d2e689a14880;hb=7c7a77698a56855d618fbea16fab442205ae6cf6;hp=24c741aa1cad237909e561f595335f9f9b52d015;hpb=3fd00798074485dfa56d283136d809b7c8bff35a;p=stockfish diff --git a/src/search.cpp b/src/search.cpp index 24c741aa..63a8221a 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -52,9 +52,6 @@ using std::endl; namespace { - // Maximum number of allowed moves per position - const int MOVES_MAX = 256; - // Types enum NodeType { NonPV, PV }; @@ -633,7 +630,7 @@ namespace { // Add some extra time if the best move has changed during the last two iterations if (Iteration > 5 && Iteration <= 50) - TimeMgr.pv_unstability(BestMoveChangesByIteration[Iteration], + TimeMgr.pv_instability(BestMoveChangesByIteration[Iteration], BestMoveChangesByIteration[Iteration-1]); // Stop search if most of MaxSearchTime is consumed at the end of the @@ -997,7 +994,7 @@ namespace { // Step 2. Check for aborted search and immediate draw if (AbortSearch || ThreadsMgr.thread_should_stop(threadID)) - return VALUE_ZERO; + return VALUE_DRAW; if (pos.is_draw() || ply >= PLY_MAX - 1) return VALUE_DRAW; @@ -2387,6 +2384,8 @@ namespace { lock_grab(&(sp->lock)); lock_release(&(sp->lock)); + // In helpful master concept a master can help only a sub-tree, and + // because here is all finished is not possible master is booked. assert(threads[threadID].state == THREAD_AVAILABLE); threads[threadID].state = THREAD_SEARCHING; @@ -2464,13 +2463,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) {} @@ -2493,9 +2490,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; } @@ -2520,12 +2517,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