mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 21:58:12 +00:00
Kernel: Use IntrusiveList to make WaitQueue allocation-free :^)
This commit is contained in:
parent
96cfddb3ac
commit
f4978b2be1
4 changed files with 30 additions and 26 deletions
|
@ -11,7 +11,6 @@
|
|||
#include <Kernel/Scheduler.h>
|
||||
#include <Kernel/UnixTypes.h>
|
||||
#include <Kernel/VM/Region.h>
|
||||
#include <Kernel/WaitQueue.h>
|
||||
#include <LibC/fd_set.h>
|
||||
|
||||
class Alarm;
|
||||
|
@ -291,27 +290,8 @@ public:
|
|||
return block<ConditionBlocker>(state_string, move(condition));
|
||||
}
|
||||
|
||||
void wait_on(WaitQueue& queue, Thread* beneficiary = nullptr, const char* reason = nullptr)
|
||||
{
|
||||
bool did_unlock = unlock_process_if_locked();
|
||||
cli();
|
||||
set_state(State::Queued);
|
||||
queue.enqueue(*current);
|
||||
// Yield and wait for the queue to wake us up again.
|
||||
if (beneficiary)
|
||||
Scheduler::donate_to(beneficiary, reason);
|
||||
else
|
||||
Scheduler::yield();
|
||||
// We've unblocked, relock the process if needed and carry on.
|
||||
if (did_unlock)
|
||||
relock_process();
|
||||
}
|
||||
|
||||
void wake_from_queue()
|
||||
{
|
||||
ASSERT(state() == State::Queued);
|
||||
set_state(State::Runnable);
|
||||
}
|
||||
void wait_on(WaitQueue& queue, Thread* beneficiary = nullptr, const char* reason = nullptr);
|
||||
void wake_from_queue();
|
||||
|
||||
void unblock();
|
||||
|
||||
|
@ -423,9 +403,11 @@ public:
|
|||
|
||||
private:
|
||||
IntrusiveListNode m_runnable_list_node;
|
||||
IntrusiveListNode m_wait_queue_node;
|
||||
|
||||
private:
|
||||
friend class SchedulerData;
|
||||
friend class WaitQueue;
|
||||
bool unlock_process_if_locked();
|
||||
void relock_process();
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue