X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fsearch.cpp;h=c4e354e4b73d6bf15de78d610aadec8fb17e9fc2;hp=4864b1cb151f70e2e1fc1849e198c9abc24802a6;hb=dafd5b58642e70c3746fc90e467c35465eb65a00;hpb=eabba1119f45f2ac8a3a6248bd1c1d9868d7af5c diff --git a/src/search.cpp b/src/search.cpp index 4864b1cb..c4e354e4 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -409,7 +409,8 @@ bool think(Position& pos, const SearchLimits& limits, Move searchMoves[]) { read_evaluation_uci_options(pos.side_to_move()); Threads.read_uci_options(); - // If needed allocate pawn and material hash tables and adjust TT size + // Allocate pawn and material hash tables if number of active threads + // increased and set a new TT size if changed. Threads.init_hash_tables(); TT.set_size(Options["Hash"].value()); @@ -2142,7 +2143,7 @@ void ThreadsManager::idle_loop(int threadID, SplitPoint* sp) { while (true) { - // Slave threads can exit as soon as AllThreadsShouldExit raises, + // Slave threads can exit as soon as allThreadsShouldExit flag raises, // master should exit as last one. if (allThreadsShouldExit) { @@ -2151,7 +2152,7 @@ void ThreadsManager::idle_loop(int threadID, SplitPoint* sp) { return; } - // If we are not thinking, wait for a condition to be signaled + // If we are not searching, wait for a condition to be signaled // instead of wasting CPU time polling for work. while ( threadID >= activeThreads || threads[threadID].state == Thread::INITIALIZING @@ -2166,7 +2167,7 @@ void ThreadsManager::idle_loop(int threadID, SplitPoint* sp) { // Grab the lock to avoid races with Thread::wake_up() lock_grab(&threads[threadID].sleepLock); - // If we are master and all slaves have finished do not go to sleep + // If we are master and all slaves have finished don't go to sleep for (i = 0; sp && i < activeThreads && !sp->is_slave[i]; i++) {} allFinished = (i == activeThreads); @@ -2176,7 +2177,10 @@ void ThreadsManager::idle_loop(int threadID, SplitPoint* sp) { break; } - // Do sleep here after retesting sleep conditions + // Do sleep after retesting sleep conditions under lock protection, in + // particular we need to avoid a deadlock in case a master thread has, + // in the meanwhile, allocated us and sent the wake_up() call before we + // had the chance to grab the lock. if (threadID >= activeThreads || threads[threadID].state == Thread::AVAILABLE) cond_wait(&threads[threadID].sleepCond, &threads[threadID].sleepLock); @@ -2191,7 +2195,6 @@ void ThreadsManager::idle_loop(int threadID, SplitPoint* sp) { threads[threadID].state = Thread::SEARCHING; // Copy split point position and search stack and call search() - // with SplitPoint template parameter set to true. SearchStack ss[PLY_MAX_PLUS_2]; SplitPoint* tsp = threads[threadID].splitPoint; Position pos(*tsp->pos, threadID); @@ -2227,14 +2230,10 @@ void ThreadsManager::idle_loop(int threadID, SplitPoint* sp) { if (allFinished) { - // Because sp->slaves[] is reset under lock protection, + // Because sp->is_slave[] is reset under lock protection, // be sure sp->lock has been released before to return. 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); return; } }