diff --git a/Kernel/Thread.cpp b/Kernel/Thread.cpp index 1dd2c2862c7..7de22633037 100644 --- a/Kernel/Thread.cpp +++ b/Kernel/Thread.cpp @@ -114,6 +114,17 @@ Thread::Thread(NonnullRefPtr 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); }