diff --git a/Kernel/VM/MemoryManager.cpp b/Kernel/VM/MemoryManager.cpp index 19a91a4d2a..9c984de81e 100644 --- a/Kernel/VM/MemoryManager.cpp +++ b/Kernel/VM/MemoryManager.cpp @@ -26,6 +26,7 @@ #include #include +#include #include #include #include @@ -50,11 +51,7 @@ extern FlatPtr end_of_kernel_bss; namespace Kernel { -// NOTE: We can NOT use AK::Singleton for this class, because -// MemoryManager::initialize is called *before* global constructors are -// run. If we do, then AK::Singleton would get re-initialized, causing -// the memory manager to be initialized twice! -static MemoryManager* s_the; +static auto s_the = AK::make_singleton(); RecursiveSpinLock s_mm_lock; MemoryManager& MM @@ -64,6 +61,8 @@ MemoryManager& MM MemoryManager::MemoryManager() { + ASSERT(!s_the.is_initialized()); + ScopedSpinLock lock(s_mm_lock); m_kernel_page_directory = PageDirectory::create_kernel_page_directory(); parse_memory_map(); @@ -221,7 +220,7 @@ void MemoryManager::initialize(u32 cpu) Processor::current().set_mm_data(*mm_data); if (cpu == 0) - s_the = new MemoryManager; + s_the.ensure_instance(); } Region* MemoryManager::kernel_region_from_vaddr(VirtualAddress vaddr) diff --git a/Kernel/VM/MemoryManager.h b/Kernel/VM/MemoryManager.h index a7a324ed0d..13e796e251 100644 --- a/Kernel/VM/MemoryManager.h +++ b/Kernel/VM/MemoryManager.h @@ -85,6 +85,7 @@ class MemoryManager { friend Optional procfs$memstat(InodeIdentifier); public: + MemoryManager(); static MemoryManager& the(); static void initialize(u32 cpu); @@ -160,7 +161,6 @@ public: PageDirectory& kernel_page_directory() { return *m_kernel_page_directory; } private: - MemoryManager(); ~MemoryManager(); enum class AccessSpace { Kernel,