Sfoglia il codice sorgente

Kernel: Don't hold thread list lock while invoking ~Thread()

There is no need for this, and it can cause deadlocks if ~Thread()
ends up doing something else that requires a lock (e.g ~Process())
Andreas Kling 3 anni fa
parent
commit
c1c12497b5
1 ha cambiato i file con 5 aggiunte e 2 eliminazioni
  1. 5 2
      Kernel/Thread.cpp

+ 5 - 2
Kernel/Thread.cpp

@@ -39,13 +39,16 @@ SpinLockProtectedValue<Thread::GlobalList>& Thread::all_threads()
 
 bool Thread::unref() const
 {
-    return all_threads().with([&](auto&) {
+    bool did_hit_zero = all_threads().with([&](auto&) {
         if (deref_base())
             return false;
         m_global_thread_list_node.remove();
-        delete this;
         return true;
     });
+
+    if (did_hit_zero)
+        delete this;
+    return did_hit_zero;
 }
 
 KResultOr<NonnullRefPtr<Thread>> Thread::try_create(NonnullRefPtr<Process> process)