mirror of
https://github.com/HChaZZY/Stockfish.git
synced 2025-12-19 16:46:30 +08:00
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:
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user