Common/MemArena: Add LazyMemoryRegion to represent a zero-initialized memory region whose pages are only allocated on first access.

This commit is contained in:
Admiral H. Curtiss
2023-09-02 04:01:32 +02:00
parent 5e5887a378
commit 5bd7756064
4 changed files with 167 additions and 0 deletions

View File

@ -433,4 +433,47 @@ void MemArena::UnmapFromMemoryRegion(void* view, size_t size)
UnmapViewOfFile(view);
}
LazyMemoryRegion::LazyMemoryRegion() = default;
LazyMemoryRegion::~LazyMemoryRegion()
{
Release();
}
void* LazyMemoryRegion::Create(size_t size)
{
ASSERT(!m_memory);
void* memory = VirtualAlloc(nullptr, size, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
if (!memory)
{
NOTICE_LOG_FMT(MEMMAP, "Memory allocation of {} bytes failed.", size);
return nullptr;
}
m_memory = memory;
m_size = size;
return memory;
}
void LazyMemoryRegion::Clear()
{
ASSERT(m_memory);
VirtualFree(m_memory, m_size, MEM_DECOMMIT);
VirtualAlloc(m_memory, m_size, MEM_COMMIT, PAGE_READWRITE);
}
void LazyMemoryRegion::Release()
{
if (m_memory)
{
VirtualFree(m_memory, 0, MEM_RELEASE);
m_memory = nullptr;
m_size = 0;
}
}
} // namespace Common