1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 05:58:11 +00:00

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.
This commit is contained in:
Tom 2020-08-21 11:00:51 -06:00 committed by Andreas Kling
parent f0906250a1
commit 8a75e0b892
2 changed files with 7 additions and 6 deletions

View file

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