Files
nob/src/platform.c
T
2026-06-09 20:13:41 +02:00

90 lines
2.0 KiB
C

#include "base_core.h"
#include "platform.h"
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/mman.h>
#define IsPageAligned(x) (IsAlignedToPow2(x, platform_page_size()))
U32 platform_page_size(void)
{
return sysconf(_SC_PAGESIZE);
}
void *platform_malloc(size_t size)
{
return malloc(size);
}
void platform_free(void *mem)
{
free(mem);
}
void *memory_allocate_and_commit(size_t size)
{
Assert(IsPageAligned(size));
void *mem = mmap(0, size, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
TRACEF("memory_allocate size=%7zu mem=%p\n", size, mem);
if (mem == MAP_FAILED) {
mem = NULL;
} else {
int rc = madvise(mem, size, MADV_POPULATE_WRITE);
if (rc != 0) {
munmap(mem, size);
mem = NULL;
}
}
return mem;
}
void memory_free(void *mem, size_t size)
{
TRACEF(" memory_free size=%7zu 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=%7zu mem=%p\n", size, mem);
if (mem == MAP_FAILED) {
mem = NULL;
}
return mem;
}
void memory_commit(void *mem, size_t size)
{
Assert(IsPageAligned((uintptr_t)mem));
Assert(IsPageAligned(size));
TRACEF("memory_commit size=%7zu mem=%p\n", size, mem);
int rc;
rc = mprotect(mem, size, PROT_READ | PROT_WRITE);
Assert(rc == 0);
rc = madvise(mem, size, MADV_WILLNEED);
Assert(rc == 0);
}
void memory_decommit(void *mem, size_t size)
{
TRACEF("memory_decommit size=%7zu mem=%p\n", size, mem);
Assert(IsPageAligned((uintptr_t)mem));
Assert(IsPageAligned(size));
int rc;
rc = mprotect(mem, size, PROT_NONE);
Assert(rc == 0);
rc = madvise(mem, size, MADV_DONTNEED);
Assert(rc == 0);
}