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>
Thread Threads[THREAD_MAX];
Lock MPLock;
Lock IOLock;
Thread Threads[THREAD_MAX];
Lock MPLock;
Lock IOLock;
- bool AllThreadsShouldExit = false;
+ bool AllThreadsShouldExit, AllThreadsShouldSleep;
SplitPoint SplitPointStack[THREAD_MAX][ACTIVE_SPLIT_POINTS_MAX];
SplitPoint SplitPointStack[THREAD_MAX][ACTIVE_SPLIT_POINTS_MAX];
#if !defined(_MSC_VER)
pthread_cond_t WaitCond;
#if !defined(_MSC_VER)
pthread_cond_t WaitCond;
int maxNodes, int maxTime, Move searchMoves[]) {
// Initialize global search variables
int maxNodes, int maxTime, Move searchMoves[]) {
// Initialize global search variables
- Idle = StopOnPonderhit = AbortSearch = Quit = false;
+ AllThreadsShouldSleep = StopOnPonderhit = AbortSearch = Quit = false;
AspirationFailLow = false;
NodesSincePoll = 0;
SearchStartTime = get_system_time();
AspirationFailLow = false;
NodesSincePoll = 0;
SearchStartTime = get_system_time();
if (UseLogFile)
LogFile.close();
if (UseLogFile)
LogFile.close();
+ AllThreadsShouldSleep = true;
SitIdleEvent[i] = CreateEvent(0, FALSE, FALSE, 0);
#endif
SitIdleEvent[i] = CreateEvent(0, FALSE, FALSE, 0);
#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
for (i = 1; i < THREAD_MAX; i++)
{
// All threads except the main thread should be initialized to idle state
for (i = 1; i < THREAD_MAX; i++)
{
void stop_threads() {
ActiveThreads = THREAD_MAX; // HACK
void stop_threads() {
ActiveThreads = THREAD_MAX; // HACK
+ AllThreadsShouldSleep = false; // HACK
wake_sleeping_threads();
AllThreadsShouldExit = true;
for (int i = 1; i < THREAD_MAX; i++)
wake_sleeping_threads();
AllThreadsShouldExit = true;
for (int i = 1; i < THREAD_MAX; i++)
Threads[threadID].running = true;
Threads[threadID].running = true;
+ while (!AllThreadsShouldExit || threadID == 0)
- if (AllThreadsShouldExit && threadID != 0)
- break;
-
// If we are not thinking, wait for a condition to be signaled
// instead of wasting CPU time polling for work.
// If we are not thinking, wait for a condition to be signaled
// 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)
pthread_mutex_lock(&WaitLock);
if (Idle || threadID >= ActiveThreads)
#if !defined(_MSC_VER)
pthread_mutex_lock(&WaitLock);
if (Idle || threadID >= ActiveThreads)
#else
WaitForSingleObject(SitIdleEvent[threadID], INFINITE);
#endif
#else
WaitForSingleObject(SitIdleEvent[threadID], INFINITE);
#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
volatile bool stop;
volatile bool running;
volatile bool idle;
volatile bool stop;
volatile bool running;
volatile bool idle;
+ volatile bool sleeping;
volatile bool workIsWaiting;
volatile bool printCurrentLine;
unsigned char pad[64]; // set some distance among local data for each thread
volatile bool workIsWaiting;
volatile bool printCurrentLine;
unsigned char pad[64]; // set some distance among local data for each thread