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:
parent
78c6bb1079
commit
c67b9916f1
1 changed files with 6 additions and 11 deletions
|
@ -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);
|
||||||
|
|
Loading…
Add table
Reference in a new issue