From 83805e64c04e57afe469dc31e15d32d95a88d124 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nils=20O=2E=20Sel=C3=A5sdal?= Date: Sun, 7 Jun 2026 20:07:58 +0200 Subject: [PATCH] Minor updates --- build.sh | 2 +- src/arena.c | 20 +++-------------- src/arena.h | 5 +---- src/main.c | 1 - src/platform.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++---- src/platform.h | 2 ++ 6 files changed, 63 insertions(+), 27 deletions(-) diff --git a/build.sh b/build.sh index e1d0aba..fa26918 100755 --- a/build.sh +++ b/build.sh @@ -1,3 +1,3 @@ #!/bin/sh set -x -clang-19 -pipe -fsanitize=address -ggdb -Wall -Wextra -Wno-unused-parameter -Wno-unused-variable -std=gnu23 $CFLAGS src/*c +clang-19 -DDEBUG -pipe -fsanitize=address -ggdb -Wall -Wextra -Wno-unused-parameter -Wno-unused-variable -std=gnu23 $CFLAGS src/*c diff --git a/src/arena.c b/src/arena.c index cc5b4c0..efdd1e9 100644 --- a/src/arena.c +++ b/src/arena.c @@ -13,13 +13,8 @@ Arena *arena_alloc(const ArenaParams *params) Assert(params->size > ARENA_HEADER_SZ); Assert(params->size < (U32_Max - ARENA_HEADER_SZ - 1)); - // Note: only backend now is malloc void *base; - if (params->flags & ArenaFlag_UseMalloc){ - base = platform_malloc(params->size); - } else { - base = memory_allocate(params->size); - } + base = memory_allocate(params->size); Assert(base != NULL); ASAN_UNPOISON_MEMORY_REGION(base, ARENA_HEADER_SZ); @@ -43,11 +38,7 @@ void arena_free(Arena *arena) while (it != NULL) { Arena *prev = it->prev; - if (it->flags & ArenaFlag_UseMalloc){ - platform_free(it->base); - } else { - memory_free(it->base, it->size); - } + memory_free(it->base, it->size); it = prev; } } @@ -98,12 +89,7 @@ void arena_pop_to(Arena *arena, U32 abs_pos) if (current->base_pos >= abs_pos) { ASAN_UNPOISON_MEMORY_REGION(current->base, current->size); // needed as we use malloc - if (current->flags & ArenaFlag_UseMalloc){ - platform_free(current->base); - } else { - memory_free(current->base, current->size); - } - + memory_free(current->base, current->size); arena->current = prev; } else { U32 new_pos = abs_pos - current->base_pos; diff --git a/src/arena.h b/src/arena.h index 2f12367..5e9e9b1 100644 --- a/src/arena.h +++ b/src/arena.h @@ -2,10 +2,7 @@ #include "base_core.h" -typedef U32 ArenaFlags; -enum { - ArenaFlag_UseMalloc = (1 << 0), -}; +typedef U32 ArenaFlags; // no flags defined yets typedef struct ArenaParams ArenaParams; struct ArenaParams { diff --git a/src/main.c b/src/main.c index 397130f..7c4c3df 100644 --- a/src/main.c +++ b/src/main.c @@ -43,7 +43,6 @@ static void arena_test_2(void) { ArenaParams arena_params = {}; arena_params.size = 1024+ARENA_HEADER_SZ; - arena_params.flags = ArenaFlag_UseMalloc; Arena *arena = arena_alloc(&arena_params); void *ptr; diff --git a/src/platform.c b/src/platform.c index 5afde47..a6ae6f7 100644 --- a/src/platform.c +++ b/src/platform.c @@ -1,8 +1,31 @@ #include "base_core.h" #include +#include #include #include + +U32 platform_page_size(void) +{ + return getpagesize(); +} + +static INLINE size_t AlignToPageSize(size_t sz) +{ + U32 page_size = platform_page_size(); + size_t aligned_sz = AlignUpPow2(sz, page_size); + + return aligned_sz; +} + +static INLINE size_t AlignToPageStart(size_t sz) +{ + U32 page_size = platform_page_size(); + size_t aligned_sz = AlignDownPow2(sz, page_size); + + return aligned_sz; +} + void *platform_malloc(size_t sz) { return malloc(sz); @@ -16,10 +39,13 @@ void platform_free(void *mem) void *memory_allocate(size_t sz) { - int page_size = getpagesize(); - size_t aligned_sz = AlignUpPow2(sz, page_size); + if (sz == 0) { + sz = 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); if (mem == MAP_FAILED) { mem = NULL; } @@ -28,10 +54,36 @@ void *memory_allocate(size_t sz) void memory_free(void *mem, size_t sz) { - int page_size = getpagesize(); - size_t aligned_sz = AlignUpPow2(sz, page_size); + size_t aligned_sz = AlignToPageSize(sz); + TRACEF(" memory_free size=%zu aligned_size=%zu mem=%p\n", sz, aligned_sz, mem); int rc = munmap(mem, aligned_sz); Assert(rc == 0); } + +void memory_commit(void *mem, size_t sz) +{ + size_t aligned_sz = AlignToPageSize(sz); + 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); + + int rc; + rc = mprotect(aligned_mem, aligned_sz, PROT_READ | PROT_WRITE); + Assert(rc == 0); + rc = madvise(aligned_mem, aligned_sz, MADV_WILLNEED); + Assert(rc == 0); +} + +void memory_decommit(void *mem, size_t sz) +{ + size_t aligned_sz = AlignToPageSize(sz); + 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); + + int rc; + rc = mprotect(aligned_mem, aligned_sz, PROT_NONE); + Assert(rc == 0); + rc = madvise(aligned_mem, aligned_sz, MADV_DONTNEED); + Assert(rc == 0); +} diff --git a/src/platform.h b/src/platform.h index ed80ba0..b693abe 100644 --- a/src/platform.h +++ b/src/platform.h @@ -3,6 +3,8 @@ void *platform_malloc(size_t sz); void platform_free(void *mem); +U32 platform_page_size(void); void *memory_allocate(size_t sz); void *memory_free(void *mem, size_t sz); +