1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-04-30 08:43:09 +00:00

Ensure function boundaries for threads state changes

Ensure threads are sleeping when leaving init_threads() and
the newly introduced put_threads_to_sleep().

Also ensure threads are not sleeping when leaving
wake_sleeping_threads().

As a side effect we now leave think() with all the threads
(but the main one) guaranteed to sleep. So when we enter
again in think(), after the opponent next move, we know
threads must be sleeping.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
Marco Costalba 2010-02-13 12:39:27 +01:00
parent a16415f44d
commit 78e494fcbc

View file

@ -280,6 +280,7 @@ namespace {
const Value futilityValue, Depth depth, int *moves,
MovePicker *mp, int master, bool pvNode);
void wake_sleeping_threads();
void put_threads_to_sleep();
#if !defined(_MSC_VER)
void *init_thread(void *threadID);
@ -335,7 +336,7 @@ bool think(const Position& pos, bool infinite, bool ponder, int side_to_move,
int maxNodes, int maxTime, Move searchMoves[]) {
// Initialize global search variables
AllThreadsShouldSleep = StopOnPonderhit = AbortSearch = Quit = false;
StopOnPonderhit = AbortSearch = Quit = false;
AspirationFailLow = false;
NodesSincePoll = 0;
SearchStartTime = get_system_time();
@ -521,7 +522,8 @@ bool think(const Position& pos, bool infinite, bool ponder, int side_to_move,
if (UseLogFile)
LogFile.close();
AllThreadsShouldSleep = true;
put_threads_to_sleep();
return !Quit;
}
@ -606,8 +608,8 @@ void init_threads() {
Application::exit_with_failure();
}
// Wait until the thread has finished launching
while (!Threads[i].running);
// Wait until the thread has finished launching and is gone to sleep
while (!Threads[i].running || !Threads[i].sleeping);
}
}
@ -618,7 +620,7 @@ void init_threads() {
void exit_threads() {
ActiveThreads = THREAD_MAX; // HACK
AllThreadsShouldSleep = false; // HACK
AllThreadsShouldSleep = true; // HACK
wake_sleeping_threads();
AllThreadsShouldExit = true;
for (int i = 1; i < THREAD_MAX; i++)
@ -3050,6 +3052,10 @@ namespace {
void wake_sleeping_threads() {
assert(AllThreadsShouldSleep);
AllThreadsShouldSleep = false;
if (ActiveThreads > 1)
{
for (int i = 1; i < ActiveThreads; i++)
@ -3076,6 +3082,22 @@ namespace {
}
// put_threads_to_sleep() makes all the threads go to sleep just before
// to leave think(), at the end of the search. Threads should have already
// finished the job and should be idle.
void put_threads_to_sleep() {
assert(!AllThreadsShouldSleep);
AllThreadsShouldSleep = true;
// Wait for the threads to be all sleeping
for (int i = 1; i < ActiveThreads; i++)
while (!Threads[i].sleeping);
}
// init_thread() is the function which is called when a new thread is
// launched. It simply calls the idle_loop() function with the supplied
// threadID. There are two versions of this function; one for POSIX