From a99096b0ff8dbaf5f3dc01a91f566e08bfea4548 Mon Sep 17 00:00:00 2001 From: Drew Galbraith Date: Wed, 21 Jun 2023 16:28:42 -0700 Subject: [PATCH] [zion] Move the scheduler to the IntrusiveList for runnable threads --- zion/object/thread.h | 3 ++- zion/scheduler/scheduler.cpp | 5 ++--- zion/scheduler/scheduler.h | 3 ++- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/zion/object/thread.h b/zion/object/thread.h index a47147f..bd8c9c4 100644 --- a/zion/object/thread.h +++ b/zion/object/thread.h @@ -1,5 +1,6 @@ #pragma once +#include #include #include @@ -14,7 +15,7 @@ struct KernelObjectTag { static const uint64_t type = KernelObject::THREAD; }; -class Thread : public KernelObject { +class Thread : public KernelObject, public glcr::IntrusiveListNode { public: uint64_t TypeTag() override { return KernelObject::THREAD; } enum State { diff --git a/zion/scheduler/scheduler.cpp b/zion/scheduler/scheduler.cpp index 214b00f..431dc04 100644 --- a/zion/scheduler/scheduler.cpp +++ b/zion/scheduler/scheduler.cpp @@ -61,7 +61,8 @@ void Scheduler::Preempt() { glcr::RefPtr prev = current_thread_; prev->SetState(Thread::RUNNABLE); - current_thread_ = runnable_threads_.CycleFront(prev); + runnable_threads_.PushBack(prev); + current_thread_ = runnable_threads_.PopFront(); SwapToCurrent(*prev); } @@ -79,7 +80,6 @@ void Scheduler::Yield() { panic("Sleep thread yielded without next."); return; } else { - // FIXME: Memory operation. current_thread_ = runnable_threads_.PopFront(); prev->SetState(Thread::RUNNABLE); } @@ -89,7 +89,6 @@ void Scheduler::Yield() { dbgln("Sleeping"); gProcMan->DumpProcessStates(); } else { - // FIXME: Memory operation. current_thread_ = runnable_threads_.PopFront(); } } diff --git a/zion/scheduler/scheduler.h b/zion/scheduler/scheduler.h index fc29f4c..ed2f0ca 100644 --- a/zion/scheduler/scheduler.h +++ b/zion/scheduler/scheduler.h @@ -1,5 +1,6 @@ #pragma once +#include #include #include "object/process.h" @@ -28,7 +29,7 @@ class Scheduler { bool enabled_ = false; glcr::RefPtr current_thread_; - LinkedList> runnable_threads_; + glcr::IntrusiveList runnable_threads_; glcr::RefPtr sleep_thread_;