diff options
author | Andreas Kling <kling@serenityos.org> | 2020-08-22 16:34:15 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2020-08-22 16:34:15 +0200 |
commit | b0a24a83be9d3885a18ae95870fff664e8c8d118 (patch) | |
tree | 7f1a0dcb26e6f0887bdcb9bbc676a24615e1a2fc /Kernel/VM | |
parent | 68580d5a8d7adae1eebfa5a8c369d96a70d06bdb (diff) | |
download | serenity-b0a24a83be9d3885a18ae95870fff664e8c8d118.zip |
Revert "Kernel: Fix regression where MemoryManager is initialized twice"
This reverts commit 8a75e0b892ab8e1c4765ac4e2f7289b258f1bf5a.
Diffstat (limited to 'Kernel/VM')
-rw-r--r-- | Kernel/VM/MemoryManager.cpp | 11 | ||||
-rw-r--r-- | Kernel/VM/MemoryManager.h | 2 |
2 files changed, 6 insertions, 7 deletions
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 <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> @@ -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<MemoryManager>(); 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<KBuffer> 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, |