Rework Arena into chain of MemoryBlock

This commit is contained in:
Nils O. Selåsdal
2026-06-07 21:05:51 +02:00
parent 4971459cbf
commit d2482d91a7
5 changed files with 151 additions and 135 deletions
+28 -28
View File
@@ -10,25 +10,25 @@ U32 platform_page_size(void)
return getpagesize();
}
static INLINE size_t AlignToPageSize(size_t sz)
static INLINE size_t AlignToPageSize(size_t size)
{
U32 page_size = platform_page_size();
size_t aligned_sz = AlignUpPow2(sz, page_size);
size_t aligned_size = AlignUpPow2(size, page_size);
return aligned_sz;
return aligned_size;
}
static INLINE size_t AlignToPageStart(size_t sz)
static INLINE size_t AlignToPageStart(size_t size)
{
U32 page_size = platform_page_size();
size_t aligned_sz = AlignDownPow2(sz, page_size);
size_t aligned_size = AlignDownPow2(size, page_size);
return aligned_sz;
return aligned_size;
}
void *platform_malloc(size_t sz)
void *platform_malloc(size_t size)
{
return malloc(sz);
return malloc(size);
}
void platform_free(void *mem)
@@ -37,53 +37,53 @@ void platform_free(void *mem)
}
void *memory_allocate(size_t sz)
void *memory_allocate(size_t size)
{
if (sz == 0) {
sz = 1;
if (size == 0) {
size = 1;
}
size_t aligned_sz = AlignToPageSize(sz);
void *mem = mmap(0, aligned_sz, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
TRACEF("memory_allocate size=%zu aligned_size=%zu mem=%p\n", sz, aligned_sz, mem);
size_t aligned_size = AlignToPageSize(size);
void *mem = mmap(0, aligned_size, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
TRACEF("memory_allocate size=%zu aligned_size=%zu mem=%p\n", size, aligned_size, mem);
if (mem == MAP_FAILED) {
mem = NULL;
}
return mem;
}
void memory_free(void *mem, size_t sz)
void memory_free(void *mem, size_t size)
{
size_t aligned_sz = AlignToPageSize(sz);
TRACEF(" memory_free size=%zu aligned_size=%zu mem=%p\n", sz, aligned_sz, mem);
size_t aligned_size = AlignToPageSize(size);
TRACEF(" memory_free size=%zu aligned_size=%zu mem=%p\n", size, aligned_size, mem);
int rc = munmap(mem, aligned_sz);
int rc = munmap(mem, aligned_size);
Assert(rc == 0);
}
void memory_commit(void *mem, size_t sz)
void memory_commit(void *mem, size_t size)
{
size_t aligned_sz = AlignToPageSize(sz);
size_t aligned_size = AlignToPageSize(size);
void *aligned_mem = (void *)AlignToPageStart((uintptr_t)mem);
TRACEF("memory_commit size=%zu aligned_size=%zu ptr=%p aligned_mem=%p\n", sz, aligned_sz, mem, aligned_mem);
TRACEF("memory_commit size=%zu aligned_size=%zu ptr=%p aligned_mem=%p\n", size, aligned_size, mem, aligned_mem);
int rc;
rc = mprotect(aligned_mem, aligned_sz, PROT_READ | PROT_WRITE);
rc = mprotect(aligned_mem, aligned_size, PROT_READ | PROT_WRITE);
Assert(rc == 0);
rc = madvise(aligned_mem, aligned_sz, MADV_WILLNEED);
rc = madvise(aligned_mem, aligned_size, MADV_WILLNEED);
Assert(rc == 0);
}
void memory_decommit(void *mem, size_t sz)
void memory_decommit(void *mem, size_t size)
{
size_t aligned_sz = AlignToPageSize(sz);
size_t aligned_size = AlignToPageSize(size);
void *aligned_mem = (void *)AlignToPageStart((uintptr_t)mem);
TRACEF("memory_commit size=%zu aligned_size=%zu ptr=%p aligned_mem=%p\n", sz, aligned_sz, mem, aligned_mem);
TRACEF("memory_commit size=%zu aligned_size=%zu ptr=%p aligned_mem=%p\n", size, aligned_size, mem, aligned_mem);
int rc;
rc = mprotect(aligned_mem, aligned_sz, PROT_NONE);
rc = mprotect(aligned_mem, aligned_size, PROT_NONE);
Assert(rc == 0);
rc = madvise(aligned_mem, aligned_sz, MADV_DONTNEED);
rc = madvise(aligned_mem, aligned_size, MADV_DONTNEED);
Assert(rc == 0);
}