Kernel: Don't hold the process list lock while destructing the process

Once we remove the process from the process list, we're free to do
whatever we want without any locks.
This commit is contained in:
sin-ack 2021-08-15 08:25:29 +00:00 committed by Andreas Kling
commit 98408b8920
Notes: sideshowbarker 2024-07-18 05:41:27 +09:00

View file

@ -302,16 +302,19 @@ bool Process::unref() const
// NOTE: We need to obtain the process list lock before doing anything,
// because otherwise someone might get in between us lowering the
// refcount and acquiring the lock.
return processes().with_exclusive([&](auto& list) {
auto did_hit_zero = processes().with_exclusive([&](auto& list) {
auto new_ref_count = deref_base();
if (new_ref_count > 0)
return false;
if (m_list_node.is_in_list())
list.remove(*const_cast<Process*>(this));
delete this;
return true;
});
if (did_hit_zero)
delete this;
return did_hit_zero;
}
// Make sure the compiler doesn't "optimize away" this function: