mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 19:37:35 +00:00
Kernel: Fix Lock racing to the WaitQueue
There was a time window between releasing Lock::m_lock and calling into the lock's WaitQueue where someone else could take m_lock and bring two threads into a deadlock situation. Fix this issue by holding Lock::m_lock until interrupts are disabled by either Thread::wait_on() or WaitQueue::wake_one().
This commit is contained in:
parent
61e6b1fb7c
commit
41376d4662
5 changed files with 13 additions and 10 deletions
|
@ -18,8 +18,7 @@ void Lock::lock()
|
|||
m_lock.store(false, AK::memory_order_release);
|
||||
return;
|
||||
}
|
||||
m_lock.store(false, AK::memory_order_release);
|
||||
current->wait_on(m_queue, m_holder, m_name);
|
||||
current->wait_on(m_queue, &m_lock, m_holder, m_name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -37,8 +36,7 @@ void Lock::unlock()
|
|||
return;
|
||||
}
|
||||
m_holder = nullptr;
|
||||
m_queue.wake_one();
|
||||
m_lock.store(false, AK::memory_order_release);
|
||||
m_queue.wake_one(&m_lock);
|
||||
return;
|
||||
}
|
||||
// I don't know *who* is using "m_lock", so just yield.
|
||||
|
@ -66,8 +64,7 @@ bool Lock::unlock_if_locked()
|
|||
return false;
|
||||
}
|
||||
m_holder = nullptr;
|
||||
m_lock.store(false, AK::memory_order_release);
|
||||
m_queue.wake_one();
|
||||
m_queue.wake_one(&m_lock);
|
||||
return true;
|
||||
}
|
||||
// I don't know *who* is using "m_lock", so just yield.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue