1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-04-29 16:23:09 +00:00

Revert sleeping threads

Revert 141caf1d5b + c59efc53c9

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
Marco Costalba 2010-11-19 07:59:51 +01:00
parent 9ecdfd2401
commit d0dc05ad41

View file

@ -94,7 +94,7 @@ namespace {
int ActiveThreads; int ActiveThreads;
volatile bool AllThreadsShouldExit; volatile bool AllThreadsShouldExit;
Thread threads[MAX_THREADS]; Thread threads[MAX_THREADS];
Lock MPLock; Lock MPLock, WaitLock;
WaitCondition WaitCond[MAX_THREADS]; 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()); init_eval(ThreadsMgr.active_threads());
} }
// Wake up needed threads
for (int i = 1; i < newActiveThreads; i++)
ThreadsMgr.wake_sleeping_thread(i);
// Set thinking time // Set thinking time
int myTime = time[pos.side_to_move()]; int myTime = time[pos.side_to_move()];
int myIncrement = increment[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) if (UseLogFile)
LogFile.close(); LogFile.close();
// This makes all the threads to go to sleep
ThreadsMgr.set_active_threads(1);
return !Quit; 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 // If we are not thinking, wait for a condition to be signaled
// instead of wasting CPU time polling for work. // instead of wasting CPU time polling for work.
while ( threadID >= ActiveThreads while (threadID >= ActiveThreads || threads[threadID].state == THREAD_INITIALIZING)
|| threads[threadID].state == THREAD_INITIALIZING
|| (!sp && threads[threadID].state == THREAD_AVAILABLE))
{ {
assert(!sp); assert(!sp);
assert(threadID != 0); assert(threadID != 0);
@ -2205,21 +2210,14 @@ split_point_start: // At split points actual search starts from here
if (AllThreadsShouldExit) if (AllThreadsShouldExit)
break; break;
lock_grab(&MPLock);
// Retest condition under lock protection
if (!( threadID >= ActiveThreads
|| threads[threadID].state == THREAD_INITIALIZING
|| (!sp && threads[threadID].state == THREAD_AVAILABLE)))
{
lock_release(&MPLock);
continue;
}
// Put thread to sleep
threads[threadID].state = THREAD_AVAILABLE; threads[threadID].state = THREAD_AVAILABLE;
cond_wait(&WaitCond[threadID], &MPLock);
lock_release(&MPLock); lock_grab(&WaitLock);
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 // 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 // Initialize global locks
lock_init(&MPLock); lock_init(&MPLock);
lock_init(&WaitLock);
for (i = 0; i < MAX_THREADS; i++) for (i = 0; i < MAX_THREADS; i++)
cond_init(&WaitCond[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++) for (int j = 0; j < MAX_ACTIVE_SPLIT_POINTS; j++)
lock_destroy(&(threads[i].splitPoints[j].lock)); lock_destroy(&(threads[i].splitPoints[j].lock));
lock_destroy(&WaitLock);
lock_destroy(&MPLock); lock_destroy(&MPLock);
// Now we can safely destroy the wait conditions // 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); assert(i == master || threads[i].state == THREAD_BOOKED);
threads[i].state = THREAD_WORKISWAITING; // This makes the slave to exit from idle_loop() 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 // 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) { void ThreadsManager::wake_sleeping_thread(int threadID) {
lock_grab(&MPLock); lock_grab(&WaitLock);
cond_signal(&WaitCond[threadID]); cond_signal(&WaitCond[threadID]);
lock_release(&MPLock); lock_release(&WaitLock);
} }