mirror of
https://github.com/HChaZZY/Stockfish.git
synced 2025-12-21 01:27:16 +08:00
Fix a (theoretical) race leading to a crash
After we release the SplitPoint lock the master, suppose is main thread, can safely return and if a "quit" command is pending, main thread exits and associated Thread object is freed. So when we access master->is_searching a crash occurs. I have never found such a race that is of course very rare becuase assumes that from lock releasing we go to sleep for a time long enough for the main thread to end the search and return. But you can never know, and anyhow a race is a race. No functional change. Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
@@ -1826,7 +1826,6 @@ void Thread::idle_loop(SplitPoint* sp_master) {
|
|||||||
|
|
||||||
Stack ss[MAX_PLY_PLUS_2];
|
Stack ss[MAX_PLY_PLUS_2];
|
||||||
Position pos(*sp->pos);
|
Position pos(*sp->pos);
|
||||||
Thread* master = sp->master;
|
|
||||||
|
|
||||||
memcpy(ss, sp->ss - 1, 4 * sizeof(Stack));
|
memcpy(ss, sp->ss - 1, 4 * sizeof(Stack));
|
||||||
(ss+1)->sp = sp;
|
(ss+1)->sp = sp;
|
||||||
@@ -1848,17 +1847,18 @@ void Thread::idle_loop(SplitPoint* sp_master) {
|
|||||||
sp->slavesMask &= ~(1ULL << idx);
|
sp->slavesMask &= ~(1ULL << idx);
|
||||||
sp->nodes += pos.nodes_searched();
|
sp->nodes += pos.nodes_searched();
|
||||||
|
|
||||||
// After releasing the lock we cannot access anymore any SplitPoint
|
|
||||||
// related data in a reliably way becuase it could have been released
|
|
||||||
// under our feet by the sp master.
|
|
||||||
lock_release(sp->lock);
|
|
||||||
|
|
||||||
// Wake up master thread so to allow it to return from the idle loop in
|
// Wake up master thread so to allow it to return from the idle loop in
|
||||||
// case we are the last slave of the split point.
|
// case we are the last slave of the split point.
|
||||||
if ( Threads.use_sleeping_threads()
|
if ( Threads.use_sleeping_threads()
|
||||||
&& this != master
|
&& this != sp->master
|
||||||
&& !master->is_searching)
|
&& !sp->master->is_searching)
|
||||||
master->wake_up();
|
sp->master->wake_up();
|
||||||
|
|
||||||
|
// After releasing the lock we cannot access anymore any SplitPoint
|
||||||
|
// related data in a safe way becuase it could have been released under
|
||||||
|
// our feet by the sp master. Also accessing other Thread objects is
|
||||||
|
// unsafe because if we are exiting there is a chance are already freed.
|
||||||
|
lock_release(sp->lock);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user