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:
parent
cb08413dc4
commit
6382324afd
2 changed files with 18 additions and 10 deletions
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Reference in a new issue