1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 03:57:43 +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:
Andreas Kling 2020-01-12 18:46:41 +01:00
parent 61e6b1fb7c
commit 41376d4662
5 changed files with 13 additions and 10 deletions

View file

@ -783,10 +783,12 @@ const LogStream& operator<<(const LogStream& stream, const Thread& value)
return stream << value.process().name() << "(" << value.pid() << ":" << value.tid() << ")";
}
void Thread::wait_on(WaitQueue& queue, Thread* beneficiary, const char* reason)
void Thread::wait_on(WaitQueue& queue, Atomic<bool>* lock, Thread* beneficiary, const char* reason)
{
bool did_unlock = unlock_process_if_locked();
cli();
if (lock)
*lock = false;
set_state(State::Queued);
queue.enqueue(*current);
// Yield and wait for the queue to wake us up again.