From e1b1b5d357f3468b2ea87c0dd33a950f0fd6c008 Mon Sep 17 00:00:00 2001 From: "Justin C. Miller" Date: Sun, 2 Aug 2020 18:11:09 -0700 Subject: [PATCH] [kernel] Don't double-construct the scheduler The scheduler singleton was getting constructed twice, once at static time and then again in main(). Make the singleton a pointer so we only construct it once. --- src/kernel/main.cpp | 2 +- src/kernel/scheduler.cpp | 5 ++++- src/kernel/scheduler.h | 4 ++-- 3 files changed, 7 insertions(+), 4 deletions(-) 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; };