Quellcode durchsuchen

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.
Tom vor 4 Jahren
Ursprung
Commit
6b97118e89
1 geänderte Dateien mit 11 neuen und 0 gelöschten Zeilen
  1. 11 0
      Kernel/Thread.cpp

+ 11 - 0
Kernel/Thread.cpp

@@ -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);
 }