diff --git a/src/kernel/main.cpp b/src/kernel/main.cpp index b2343d9..74423ab 100644 --- a/src/kernel/main.cpp +++ b/src/kernel/main.cpp @@ -174,7 +174,7 @@ kernel_main(args::header *header) devices.init_drivers(); syscall_enable(); - scheduler *sched = new (&scheduler::get()) scheduler(devices.get_lapic()); + scheduler *sched = new scheduler(devices.get_lapic()); sched->create_kernel_task(logger_task, scheduler::max_priority-1, true); diff --git a/src/kernel/scheduler.cpp b/src/kernel/scheduler.cpp index cb69c13..8c5a80d 100644 --- a/src/kernel/scheduler.cpp +++ b/src/kernel/scheduler.cpp @@ -16,7 +16,7 @@ #include "elf/elf.h" #include "kutil/assert.h" -scheduler scheduler::s_instance(nullptr); +scheduler *scheduler::s_instance = nullptr; const uint64_t rflags_noint = 0x002; const uint64_t rflags_int = 0x202; @@ -34,6 +34,9 @@ scheduler::scheduler(lapic *apic) : m_clock(0), m_last_promotion(0) { + kassert(!s_instance, "Multiple schedulers created!"); + s_instance = this; + page_table *pml4 = page_manager::get_pml4(); process *kp = new process(pml4); m_kernel_process = kp; diff --git a/src/kernel/scheduler.h b/src/kernel/scheduler.h index a42094c..f67bf2a 100644 --- a/src/kernel/scheduler.h +++ b/src/kernel/scheduler.h @@ -73,7 +73,7 @@ public: /// Get a reference to the system scheduler /// \returns A reference to the global system scheduler - static scheduler & get() { return s_instance; } + static scheduler & get() { return *s_instance; } private: friend uintptr_t syscall_dispatch(uintptr_t, cpu_state &); @@ -105,6 +105,6 @@ private: uint64_t m_clock = 0; uint64_t m_last_promotion; - static scheduler s_instance; + static scheduler *s_instance; };