Fix race condition where idle_loop() gets called from Split()

SplitPoint member slavesMask wasn't read under lock

No functional change.
This commit is contained in:
jundery
2013-03-03 23:44:46 -07:00
committed by Marco Costalba
parent 3ce43c20de
commit d165d5af91
2 changed files with 12 additions and 1 deletions

View File

@@ -312,6 +312,7 @@ void Thread::split(Position& pos, Stack* ss, Value alpha, Value beta, Value* bes
sp.mutex.unlock();
Threads.mutex.unlock();
// Calling idle_loop with sp.mutex locked
Thread::idle_loop(); // Force a call to base class idle_loop()
// In helpful master concept a master can help only a sub-tree of its split
@@ -322,6 +323,10 @@ void Thread::split(Position& pos, Stack* ss, Value alpha, Value beta, Value* bes
// We have returned from the idle loop, which means that all threads are
// finished. Note that setting 'searching' and decreasing splitPointsSize is
// done under lock protection to avoid a race with Thread::is_available_to().
// idle_loop returns with sp.mutex locked but we must unlock it inorder to
// lock Threads.mutex without conflicting with check_time() (threads holding
// multiple locks must always acquired them in the same order to avoid deadlocks)
sp.mutex.unlock();
Threads.mutex.lock();
sp.mutex.lock();
}