Retire Thread::INITIALIZING
authorMarco Costalba <mcostalba@gmail.com>
Mon, 8 Aug 2011 12:41:58 +0000 (13:41 +0100)
committerMarco Costalba <mcostalba@gmail.com>
Mon, 8 Aug 2011 13:12:02 +0000 (14:12 +0100)
Was used to prevent issues when creating multiple threads
on Windows, but now it seems we can remove it safely.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
src/search.cpp
src/thread.cpp
src/thread.h

index 49074cee9c20d6a1bb9ff733394c7a966115d42e..eda9d2929847377916e20fc7608e3c7659531c2f 100644 (file)
@@ -2159,23 +2159,20 @@ void Thread::idle_loop(SplitPoint* sp) {
              || do_terminate
              || (Threads.use_sleeping_threads() && state == Thread::AVAILABLE))
       {
-          assert(!sp || Threads.use_sleeping_threads());
-          assert(threadID != 0 || Threads.use_sleeping_threads());
+          assert((!sp && threadID) || Threads.use_sleeping_threads());
+
+          // Grab the lock to avoid races with Thread::wake_up()
+          lock_grab(&sleepLock);
 
           // Slave thread should exit as soon as do_terminate flag raises
           if (do_terminate)
           {
               assert(!sp);
               state = Thread::TERMINATED;
+              lock_release(&sleepLock);
               return;
           }
 
-          if (state == Thread::INITIALIZING)
-              state = Thread::AVAILABLE;
-
-          // Grab the lock to avoid races with Thread::wake_up()
-          lock_grab(&sleepLock);
-
           // If we are master and all slaves have finished don't go to sleep
           if (sp && all_slaves_finished(sp))
           {
index 5c10eee0635e8ddbf531d3e84577629aa74b0c01..e631645b3a836350b32f6ed703509e662f6fa4af 100644 (file)
@@ -135,7 +135,7 @@ void ThreadsManager::set_size(int cnt) {
 
 void ThreadsManager::init() {
 
-  // Threads will sent to sleep as soon as created, only main thread is kept alive
+  // Threads will go to sleep as soon as created, only main thread is kept alive
   set_size(1);
   threads[0].state = Thread::SEARCHING;
   threads[0].threadID = 0;
@@ -159,7 +159,7 @@ void ThreadsManager::init() {
   // Create and startup all the threads but the main that is already running
   for (int i = 1; i < MAX_THREADS; i++)
   {
-      threads[i].state = Thread::INITIALIZING;
+      threads[i].state = Thread::AVAILABLE;
       threads[i].threadID = i;
 
 #if defined(_MSC_VER)
@@ -174,9 +174,6 @@ void ThreadsManager::init() {
           std::cout << "Failed to create thread number " << i << std::endl;
           ::exit(EXIT_FAILURE);
       }
-
-      // Wait until the thread has finished launching and is gone to sleep
-      while (threads[i].state == Thread::INITIALIZING) {}
   }
 }
 
index 3a2d8538b0a84d73ba50b5caf7bc42a138ab00ba..aba43c902d6f0a455ef229fba02880b74832f92c 100644 (file)
@@ -67,7 +67,6 @@ struct Thread {
 
   enum ThreadState
   {
-    INITIALIZING,  // Thread is initializing itself
     SEARCHING,     // Thread is performing work
     AVAILABLE,     // Thread is waiting for work
     WORKISWAITING, // Master has ordered us to start searching