From: Marco Costalba Date: Sat, 13 Feb 2010 10:22:57 +0000 (+0100) Subject: Add 'sleeping' flag to struct Thread X-Git-Url: https://git.sesse.net/?p=stockfish;a=commitdiff_plain;h=6382324afda5cab5657863fa3e38de6c21fc55ed Add 'sleeping' flag to struct Thread Will be used by future patches. Also: - Renamed Idle in AllThreadsShouldSleep - Explicitly inited AllThreadsShouldExit and AllThreadsShouldSleep in init_thread() instead of use an anonymous global initialization. - Rewritten idle_loop() while condition to avoid a 'break' statement No functional change. Signed-off-by: Marco Costalba --- diff --git a/src/search.cpp b/src/search.cpp index 387c92b0..ba9b9478 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -219,9 +219,8 @@ namespace { Thread Threads[THREAD_MAX]; Lock MPLock; Lock IOLock; - bool AllThreadsShouldExit = false; + bool AllThreadsShouldExit, AllThreadsShouldSleep; SplitPoint SplitPointStack[THREAD_MAX][ACTIVE_SPLIT_POINTS_MAX]; - bool Idle = true; #if !defined(_MSC_VER) pthread_cond_t WaitCond; @@ -336,7 +335,7 @@ bool think(const Position& pos, bool infinite, bool ponder, int side_to_move, int maxNodes, int maxTime, Move searchMoves[]) { // Initialize global search variables - Idle = StopOnPonderhit = AbortSearch = Quit = false; + AllThreadsShouldSleep = StopOnPonderhit = AbortSearch = Quit = false; AspirationFailLow = false; NodesSincePoll = 0; SearchStartTime = get_system_time(); @@ -522,7 +521,7 @@ bool think(const Position& pos, bool infinite, bool ponder, int side_to_move, if (UseLogFile) LogFile.close(); - Idle = true; + AllThreadsShouldSleep = true; return !Quit; } @@ -584,6 +583,12 @@ void init_threads() { SitIdleEvent[i] = CreateEvent(0, FALSE, FALSE, 0); #endif + // Will be set just before program exits to properly end the threads + AllThreadsShouldExit = false; + + // Threads will be put to sleep as soon as created + AllThreadsShouldSleep = true; + // All threads except the main thread should be initialized to idle state for (i = 1; i < THREAD_MAX; i++) { @@ -621,7 +626,7 @@ void init_threads() { void stop_threads() { ActiveThreads = THREAD_MAX; // HACK - Idle = false; // HACK + AllThreadsShouldSleep = false; // HACK wake_sleeping_threads(); AllThreadsShouldExit = true; for (int i = 1; i < THREAD_MAX; i++) @@ -2776,16 +2781,17 @@ namespace { Threads[threadID].running = true; - while (true) + while (!AllThreadsShouldExit || threadID == 0) { - if (AllThreadsShouldExit && threadID != 0) - break; - // If we are not thinking, wait for a condition to be signaled // instead of wasting CPU time polling for work. - while (threadID != 0 && (Idle || threadID >= ActiveThreads)) + while ( threadID != 0 + && !AllThreadsShouldExit + && (AllThreadsShouldSleep || threadID >= ActiveThreads)) { + Threads[threadID].sleeping = true; + #if !defined(_MSC_VER) pthread_mutex_lock(&WaitLock); if (Idle || threadID >= ActiveThreads) @@ -2795,6 +2801,7 @@ namespace { #else WaitForSingleObject(SitIdleEvent[threadID], INFINITE); #endif + Threads[threadID].sleeping = false; } // If this thread has been assigned work, launch a search diff --git a/src/thread.h b/src/thread.h index 30289509..d8eee1c1 100644 --- a/src/thread.h +++ b/src/thread.h @@ -71,6 +71,7 @@ struct Thread { volatile bool stop; volatile bool running; volatile bool idle; + volatile bool sleeping; volatile bool workIsWaiting; volatile bool printCurrentLine; unsigned char pad[64]; // set some distance among local data for each thread