Proper memory commitment
This commit is contained in:
+31
-36
@@ -1,30 +1,18 @@
|
||||
#include "base_core.h"
|
||||
#include "platform.h"
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/mman.h>
|
||||
|
||||
|
||||
#define IsPageAligned(x) (IsAlignedTo(x, platform_page_size()))
|
||||
|
||||
U32 platform_page_size(void)
|
||||
{
|
||||
return getpagesize();
|
||||
}
|
||||
|
||||
static INLINE size_t AlignToPageSize(size_t size)
|
||||
{
|
||||
U32 page_size = platform_page_size();
|
||||
size_t aligned_size = AlignUpPow2(size, page_size);
|
||||
|
||||
return aligned_size;
|
||||
}
|
||||
|
||||
static INLINE size_t AlignToPageStart(size_t size)
|
||||
{
|
||||
U32 page_size = platform_page_size();
|
||||
size_t aligned_size = AlignDownPow2(size, page_size);
|
||||
|
||||
return aligned_size;
|
||||
}
|
||||
|
||||
void *platform_malloc(size_t size)
|
||||
{
|
||||
@@ -39,13 +27,10 @@ void platform_free(void *mem)
|
||||
|
||||
void *memory_allocate(size_t size)
|
||||
{
|
||||
if (size == 0) {
|
||||
size = 1;
|
||||
}
|
||||
Assert(IsPow2(size));
|
||||
|
||||
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);
|
||||
void *mem = mmap(0, size, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
|
||||
TRACEF("memory_allocate size=%zu mem=%p\n", size, mem);
|
||||
if (mem == MAP_FAILED) {
|
||||
mem = NULL;
|
||||
}
|
||||
@@ -54,36 +39,46 @@ void *memory_allocate(size_t size)
|
||||
|
||||
void memory_free(void *mem, size_t size)
|
||||
{
|
||||
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_size);
|
||||
TRACEF(" memory_free size=%zu mem=%p\n", size, mem);
|
||||
Assert(IsPageAligned((uintptr_t)mem));
|
||||
Assert(IsPageAligned(size));
|
||||
int rc = munmap(mem, size);
|
||||
|
||||
Assert(rc == 0);
|
||||
|
||||
}
|
||||
void *memory_reserve(size_t size)
|
||||
{
|
||||
Assert(IsPageAligned(size));
|
||||
void *mem = mmap(0, size, PROT_NONE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
|
||||
TRACEF("memory_reserve size=%zu mem=%p\n", size, mem);
|
||||
if (mem == MAP_FAILED) {
|
||||
mem = NULL;
|
||||
}
|
||||
return mem;
|
||||
}
|
||||
|
||||
void memory_commit(void *mem, size_t size)
|
||||
{
|
||||
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", size, aligned_size, mem, aligned_mem);
|
||||
Assert(IsPageAligned((uintptr_t)mem));
|
||||
Assert(IsPageAligned(size));
|
||||
TRACEF("memory_commit size=%zu mem=%p\n", size, mem);
|
||||
|
||||
int rc;
|
||||
rc = mprotect(aligned_mem, aligned_size, PROT_READ | PROT_WRITE);
|
||||
rc = mprotect(mem, size, PROT_READ | PROT_WRITE);
|
||||
Assert(rc == 0);
|
||||
rc = madvise(aligned_mem, aligned_size, MADV_WILLNEED);
|
||||
rc = madvise(mem, size, MADV_WILLNEED);
|
||||
Assert(rc == 0);
|
||||
}
|
||||
|
||||
void memory_decommit(void *mem, size_t size)
|
||||
{
|
||||
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", size, aligned_size, mem, aligned_mem);
|
||||
|
||||
TRACEF("memory_decommit size=%zu mem=%p\n", size, mem);
|
||||
Assert(IsPageAligned((uintptr_t)mem));
|
||||
Assert(IsPageAligned(size));
|
||||
int rc;
|
||||
rc = mprotect(aligned_mem, aligned_size, PROT_NONE);
|
||||
rc = mprotect(mem, size, PROT_NONE);
|
||||
Assert(rc == 0);
|
||||
rc = madvise(aligned_mem, aligned_size, MADV_DONTNEED);
|
||||
rc = madvise(mem, size, MADV_DONTNEED);
|
||||
Assert(rc == 0);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user