]> git.sesse.net Git - stockfish/commitdiff
Add 'sleeping' flag to struct Thread
authorMarco Costalba <mcostalba@gmail.com>
Sat, 13 Feb 2010 10:22:57 +0000 (11:22 +0100)
committerMarco Costalba <mcostalba@gmail.com>
Sat, 13 Feb 2010 10:28:33 +0000 (11:28 +0100)
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 <mcostalba@gmail.com>
src/search.cpp
src/thread.h

index 387c92b01acc2021b2103aaa9b78bfafff281108..ba9b947845b6f867d297632b9ddd7dce3cc9cc69 100644 (file)
@@ -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
index 302895095f856927e9061f42eab8e7aab4c98c48..d8eee1c126de09aaec29c999783a245caa11f329 100644 (file)
@@ -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