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

Fix some races

Resurrect extra check for sleeping in POSIX code.
This necessary to prevent ugly races between
thread_broadcast and thread_cond_wait.

After thread has woken up, it marks itself as available.
Another thread must not do this, because of possible race.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
Joona Kiiski 2010-02-22 15:15:55 +02:00 committed by Marco Costalba
parent 78c6bb1079
commit c67b9916f1

View file

@ -442,9 +442,6 @@ bool think(const Position& pos, bool infinite, bool ponder, int side_to_move,
// Wake up sleeping threads // Wake up sleeping threads
TM.wake_sleeping_threads(); TM.wake_sleeping_threads();
for (int i = 1; i < TM.active_threads(); i++)
assert(TM.thread_is_available(i, 0));
// Set thinking time // Set thinking time
int myTime = time[side_to_move]; int myTime = time[side_to_move];
int myIncrement = increment[side_to_move]; int myIncrement = increment[side_to_move];
@ -2595,22 +2592,24 @@ namespace {
// 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 while ( threadID != 0
&& !AllThreadsShouldExit
&& (AllThreadsShouldSleep || threadID >= ActiveThreads)) && (AllThreadsShouldSleep || threadID >= ActiveThreads))
{ {
threads[threadID].state = THREAD_SLEEPING; threads[threadID].state = THREAD_SLEEPING;
#if !defined(_MSC_VER) #if !defined(_MSC_VER)
pthread_mutex_lock(&WaitLock); pthread_mutex_lock(&WaitLock);
if (AllThreadsShouldSleep || threadID >= ActiveThreads)
pthread_cond_wait(&WaitCond, &WaitLock); pthread_cond_wait(&WaitCond, &WaitLock);
pthread_mutex_unlock(&WaitLock); pthread_mutex_unlock(&WaitLock);
#else #else
WaitForSingleObject(SitIdleEvent[threadID], INFINITE); WaitForSingleObject(SitIdleEvent[threadID], INFINITE);
#endif #endif
// State is already changed by wake_sleeping_threads()
assert(threads[threadID].state == THREAD_AVAILABLE || threadID >= ActiveThreads);
} }
// If thread has just woken up, mark it as available
if (threads[threadID].state == THREAD_SLEEPING)
threads[threadID].state = THREAD_AVAILABLE;
// If this thread has been assigned work, launch a search // If this thread has been assigned work, launch a search
if (threads[threadID].state == THREAD_WORKISWAITING) if (threads[threadID].state == THREAD_WORKISWAITING)
{ {
@ -2933,12 +2932,8 @@ namespace {
return; return;
for (int i = 1; i < ActiveThreads; i++) for (int i = 1; i < ActiveThreads; i++)
{
assert(threads[i].state == THREAD_SLEEPING); assert(threads[i].state == THREAD_SLEEPING);
threads[i].state = THREAD_AVAILABLE;
}
#if !defined(_MSC_VER) #if !defined(_MSC_VER)
pthread_mutex_lock(&WaitLock); pthread_mutex_lock(&WaitLock);
pthread_cond_broadcast(&WaitCond); pthread_cond_broadcast(&WaitCond);