1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-07-11 19:49:14 +00:00

Add 'sleeping' flag to struct Thread

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>
This commit is contained in:
Marco Costalba 2010-02-13 11:22:57 +01:00
parent cb08413dc4
commit 6382324afd
2 changed files with 18 additions and 10 deletions

View file

@ -219,9 +219,8 @@ namespace {
Thread Threads[THREAD_MAX]; Thread Threads[THREAD_MAX];
Lock MPLock; Lock MPLock;
Lock IOLock; Lock IOLock;
bool AllThreadsShouldExit = false; bool AllThreadsShouldExit, AllThreadsShouldSleep;
SplitPoint SplitPointStack[THREAD_MAX][ACTIVE_SPLIT_POINTS_MAX]; SplitPoint SplitPointStack[THREAD_MAX][ACTIVE_SPLIT_POINTS_MAX];
bool Idle = true;
#if !defined(_MSC_VER) #if !defined(_MSC_VER)
pthread_cond_t WaitCond; 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[]) { int maxNodes, int maxTime, Move searchMoves[]) {
// Initialize global search variables // Initialize global search variables
Idle = StopOnPonderhit = AbortSearch = Quit = false; AllThreadsShouldSleep = StopOnPonderhit = AbortSearch = Quit = false;
AspirationFailLow = false; AspirationFailLow = false;
NodesSincePoll = 0; NodesSincePoll = 0;
SearchStartTime = get_system_time(); SearchStartTime = get_system_time();
@ -522,7 +521,7 @@ bool think(const Position& pos, bool infinite, bool ponder, int side_to_move,
if (UseLogFile) if (UseLogFile)
LogFile.close(); LogFile.close();
Idle = true; AllThreadsShouldSleep = true;
return !Quit; return !Quit;
} }
@ -584,6 +583,12 @@ void init_threads() {
SitIdleEvent[i] = CreateEvent(0, FALSE, FALSE, 0); SitIdleEvent[i] = CreateEvent(0, FALSE, FALSE, 0);
#endif #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 // All threads except the main thread should be initialized to idle state
for (i = 1; i < THREAD_MAX; i++) for (i = 1; i < THREAD_MAX; i++)
{ {
@ -621,7 +626,7 @@ void init_threads() {
void stop_threads() { void stop_threads() {
ActiveThreads = THREAD_MAX; // HACK ActiveThreads = THREAD_MAX; // HACK
Idle = false; // HACK AllThreadsShouldSleep = false; // HACK
wake_sleeping_threads(); wake_sleeping_threads();
AllThreadsShouldExit = true; AllThreadsShouldExit = true;
for (int i = 1; i < THREAD_MAX; i++) for (int i = 1; i < THREAD_MAX; i++)
@ -2776,16 +2781,17 @@ namespace {
Threads[threadID].running = true; 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 // 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 != 0 && (Idle || threadID >= ActiveThreads)) while ( threadID != 0
&& !AllThreadsShouldExit
&& (AllThreadsShouldSleep || threadID >= ActiveThreads))
{ {
Threads[threadID].sleeping = true;
#if !defined(_MSC_VER) #if !defined(_MSC_VER)
pthread_mutex_lock(&WaitLock); pthread_mutex_lock(&WaitLock);
if (Idle || threadID >= ActiveThreads) if (Idle || threadID >= ActiveThreads)
@ -2795,6 +2801,7 @@ namespace {
#else #else
WaitForSingleObject(SitIdleEvent[threadID], INFINITE); WaitForSingleObject(SitIdleEvent[threadID], INFINITE);
#endif #endif
Threads[threadID].sleeping = false;
} }
// If this thread has been assigned work, launch a search // If this thread has been assigned work, launch a search

View file

@ -71,6 +71,7 @@ struct Thread {
volatile bool stop; volatile bool stop;
volatile bool running; volatile bool running;
volatile bool idle; volatile bool idle;
volatile bool sleeping;
volatile bool workIsWaiting; volatile bool workIsWaiting;
volatile bool printCurrentLine; volatile bool printCurrentLine;
unsigned char pad[64]; // set some distance among local data for each thread unsigned char pad[64]; // set some distance among local data for each thread