From d0dc05ad419902d869efdec012a1d82a7b34ff92 Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Fri, 19 Nov 2010 07:59:51 +0100 Subject: [PATCH] Revert sleeping threads Revert 141caf1d5b64 + c59efc53c9 Signed-off-by: Marco Costalba --- src/search.cpp | 40 +++++++++++++++++++--------------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/src/search.cpp b/src/search.cpp index 2c91d778..4bacbef0 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -94,7 +94,7 @@ namespace { int ActiveThreads; volatile bool AllThreadsShouldExit; Thread threads[MAX_THREADS]; - Lock MPLock; + Lock MPLock, WaitLock; WaitCondition WaitCond[MAX_THREADS]; }; @@ -469,6 +469,10 @@ bool think(Position& pos, bool infinite, bool ponder, int time[], int increment[ init_eval(ThreadsMgr.active_threads()); } + // Wake up needed threads + for (int i = 1; i < newActiveThreads; i++) + ThreadsMgr.wake_sleeping_thread(i); + // Set thinking time int myTime = time[pos.side_to_move()]; int myIncrement = increment[pos.side_to_move()]; @@ -501,6 +505,9 @@ bool think(Position& pos, bool infinite, bool ponder, int time[], int increment[ if (UseLogFile) LogFile.close(); + // This makes all the threads to go to sleep + ThreadsMgr.set_active_threads(1); + return !Quit; } @@ -2195,9 +2202,7 @@ split_point_start: // At split points actual search starts from here // If we are not thinking, wait for a condition to be signaled // instead of wasting CPU time polling for work. - while ( threadID >= ActiveThreads - || threads[threadID].state == THREAD_INITIALIZING - || (!sp && threads[threadID].state == THREAD_AVAILABLE)) + while (threadID >= ActiveThreads || threads[threadID].state == THREAD_INITIALIZING) { assert(!sp); assert(threadID != 0); @@ -2205,21 +2210,14 @@ split_point_start: // At split points actual search starts from here if (AllThreadsShouldExit) break; - lock_grab(&MPLock); + threads[threadID].state = THREAD_AVAILABLE; - // Retest condition under lock protection - if (!( threadID >= ActiveThreads - || threads[threadID].state == THREAD_INITIALIZING - || (!sp && threads[threadID].state == THREAD_AVAILABLE))) - { - lock_release(&MPLock); - continue; - } + lock_grab(&WaitLock); - // Put thread to sleep - threads[threadID].state = THREAD_AVAILABLE; - cond_wait(&WaitCond[threadID], &MPLock); - lock_release(&MPLock); + if (threadID >= ActiveThreads || threads[threadID].state == THREAD_INITIALIZING) + cond_wait(&WaitCond[threadID], &WaitLock); + + lock_release(&WaitLock); } // If this thread has been assigned work, launch a search @@ -2279,6 +2277,7 @@ split_point_start: // At split points actual search starts from here // Initialize global locks lock_init(&MPLock); + lock_init(&WaitLock); for (i = 0; i < MAX_THREADS; i++) cond_init(&WaitCond[i]); @@ -2342,6 +2341,7 @@ split_point_start: // At split points actual search starts from here for (int j = 0; j < MAX_ACTIVE_SPLIT_POINTS; j++) lock_destroy(&(threads[i].splitPoints[j].lock)); + lock_destroy(&WaitLock); lock_destroy(&MPLock); // Now we can safely destroy the wait conditions @@ -2507,8 +2507,6 @@ split_point_start: // At split points actual search starts from here assert(i == master || threads[i].state == THREAD_BOOKED); threads[i].state = THREAD_WORKISWAITING; // This makes the slave to exit from idle_loop() - if (i != master) - wake_sleeping_thread(i); } // Everything is set up. The master thread enters the idle loop, from @@ -2537,9 +2535,9 @@ split_point_start: // At split points actual search starts from here void ThreadsManager::wake_sleeping_thread(int threadID) { - lock_grab(&MPLock); + lock_grab(&WaitLock); cond_signal(&WaitCond[threadID]); - lock_release(&MPLock); + lock_release(&WaitLock); } -- 2.39.2