summaryrefslogtreecommitdiff
path: root/Kernel/VM
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2020-08-22 16:34:15 +0200
committerAndreas Kling <kling@serenityos.org>2020-08-22 16:34:15 +0200
commitb0a24a83be9d3885a18ae95870fff664e8c8d118 (patch)
tree7f1a0dcb26e6f0887bdcb9bbc676a24615e1a2fc /Kernel/VM
parent68580d5a8d7adae1eebfa5a8c369d96a70d06bdb (diff)
downloadserenity-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.cpp11
-rw-r--r--Kernel/VM/MemoryManager.h2
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,