diff options
author | Tom <tomut@yahoo.com> | 2020-08-21 11:00:51 -0600 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2020-08-22 10:46:24 +0200 |
commit | 8a75e0b892ab8e1c4765ac4e2f7289b258f1bf5a (patch) | |
tree | cc69a6a1f51d885ae63c1d32a878bcd5416b6274 | |
parent | f0906250a181c831508a45434b9f645ff98f33e4 (diff) | |
download | serenity-8a75e0b892ab8e1c4765ac4e2f7289b258f1bf5a.zip |
Kernel: Fix regression where MemoryManager is initialized twice
MemoryManager cannot use the Singleton class because
MemoryManager::initialize is called before the global constructors
are run. That caused the Singleton to be re-initialized, causing
it to create another MemoryManager instance.
-rw-r--r-- | Kernel/VM/MemoryManager.cpp | 11 | ||||
-rw-r--r-- | Kernel/VM/MemoryManager.h | 2 |
2 files changed, 7 insertions, 6 deletions
diff --git a/Kernel/VM/MemoryManager.cpp b/Kernel/VM/MemoryManager.cpp index 9c984de81e..19a91a4d2a 100644 --- a/Kernel/VM/MemoryManager.cpp +++ b/Kernel/VM/MemoryManager.cpp @@ -26,7 +26,6 @@ #include <AK/Assertions.h> #include <AK/Memory.h> -#include <AK/Singleton.h> #include <AK/StringView.h> #include <Kernel/Arch/i386/CPU.h> #include <Kernel/CMOS.h> @@ -51,7 +50,11 @@ extern FlatPtr end_of_kernel_bss; namespace Kernel { -static auto s_the = AK::make_singleton<MemoryManager>(); +// 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; RecursiveSpinLock s_mm_lock; MemoryManager& MM @@ -61,8 +64,6 @@ 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(); @@ -220,7 +221,7 @@ void MemoryManager::initialize(u32 cpu) Processor::current().set_mm_data(*mm_data); if (cpu == 0) - s_the.ensure_instance(); + s_the = new MemoryManager; } Region* MemoryManager::kernel_region_from_vaddr(VirtualAddress vaddr) diff --git a/Kernel/VM/MemoryManager.h b/Kernel/VM/MemoryManager.h index 13e796e251..a7a324ed0d 100644 --- a/Kernel/VM/MemoryManager.h +++ b/Kernel/VM/MemoryManager.h @@ -85,7 +85,6 @@ class MemoryManager { friend Optional<KBuffer> procfs$memstat(InodeIdentifier); public: - MemoryManager(); static MemoryManager& the(); static void initialize(u32 cpu); @@ -161,6 +160,7 @@ public: PageDirectory& kernel_page_directory() { return *m_kernel_page_directory; } private: + MemoryManager(); ~MemoryManager(); enum class AccessSpace { Kernel, |