Kernel: Fix race during thread destruction if it is preempted

This fixes a lot of crashes in Bochs, which is more likely to
preempt thread destruction.
This commit is contained in:
Tom 2020-11-11 16:05:00 -07:00 committed by Andreas Kling
parent 352e0196e1
commit 6b97118e89

View file

@ -114,6 +114,17 @@ Thread::Thread(NonnullRefPtr<Process> process)
Thread::~Thread()
{
{
// We need to explicitly remove ourselves from the thread list
// here. We may get pre-empted in the middle of destructing this
// thread, which causes problems if the thread list is iterated.
// Specifically, if this is the last thread of a process, checking
// block conditions would access m_process, which would be in
// the middle of being destroyed.
ScopedSpinLock lock(g_scheduler_lock);
g_scheduler_data->thread_list_for_state(m_state).remove(*this);
}
ASSERT(!m_joiner);
}