|
@@ -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)
|