mirror of
https://github.com/fergalmoran/ladybird.git
synced 2026-02-21 15:14:13 +00:00
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:
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user