[zion] Move the scheduler to the IntrusiveList for runnable threads
This commit is contained in:
parent
25737d9377
commit
a99096b0ff
|
@ -1,5 +1,6 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <glacier/container/intrusive_list.h>
|
||||||
#include <glacier/memory/ref_ptr.h>
|
#include <glacier/memory/ref_ptr.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
@ -14,7 +15,7 @@ struct KernelObjectTag<Thread> {
|
||||||
static const uint64_t type = KernelObject::THREAD;
|
static const uint64_t type = KernelObject::THREAD;
|
||||||
};
|
};
|
||||||
|
|
||||||
class Thread : public KernelObject {
|
class Thread : public KernelObject, public glcr::IntrusiveListNode<Thread> {
|
||||||
public:
|
public:
|
||||||
uint64_t TypeTag() override { return KernelObject::THREAD; }
|
uint64_t TypeTag() override { return KernelObject::THREAD; }
|
||||||
enum State {
|
enum State {
|
||||||
|
|
|
@ -61,7 +61,8 @@ void Scheduler::Preempt() {
|
||||||
|
|
||||||
glcr::RefPtr<Thread> prev = current_thread_;
|
glcr::RefPtr<Thread> prev = current_thread_;
|
||||||
prev->SetState(Thread::RUNNABLE);
|
prev->SetState(Thread::RUNNABLE);
|
||||||
current_thread_ = runnable_threads_.CycleFront(prev);
|
runnable_threads_.PushBack(prev);
|
||||||
|
current_thread_ = runnable_threads_.PopFront();
|
||||||
|
|
||||||
SwapToCurrent(*prev);
|
SwapToCurrent(*prev);
|
||||||
}
|
}
|
||||||
|
@ -79,7 +80,6 @@ void Scheduler::Yield() {
|
||||||
panic("Sleep thread yielded without next.");
|
panic("Sleep thread yielded without next.");
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
// FIXME: Memory operation.
|
|
||||||
current_thread_ = runnable_threads_.PopFront();
|
current_thread_ = runnable_threads_.PopFront();
|
||||||
prev->SetState(Thread::RUNNABLE);
|
prev->SetState(Thread::RUNNABLE);
|
||||||
}
|
}
|
||||||
|
@ -89,7 +89,6 @@ void Scheduler::Yield() {
|
||||||
dbgln("Sleeping");
|
dbgln("Sleeping");
|
||||||
gProcMan->DumpProcessStates();
|
gProcMan->DumpProcessStates();
|
||||||
} else {
|
} else {
|
||||||
// FIXME: Memory operation.
|
|
||||||
current_thread_ = runnable_threads_.PopFront();
|
current_thread_ = runnable_threads_.PopFront();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <glacier/container/intrusive_list.h>
|
||||||
#include <glacier/memory/ref_ptr.h>
|
#include <glacier/memory/ref_ptr.h>
|
||||||
|
|
||||||
#include "object/process.h"
|
#include "object/process.h"
|
||||||
|
@ -28,7 +29,7 @@ class Scheduler {
|
||||||
bool enabled_ = false;
|
bool enabled_ = false;
|
||||||
|
|
||||||
glcr::RefPtr<Thread> current_thread_;
|
glcr::RefPtr<Thread> current_thread_;
|
||||||
LinkedList<glcr::RefPtr<Thread>> runnable_threads_;
|
glcr::IntrusiveList<Thread> runnable_threads_;
|
||||||
|
|
||||||
glcr::RefPtr<Thread> sleep_thread_;
|
glcr::RefPtr<Thread> sleep_thread_;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue