From 4b61f589fd66370bce28b9bc054aed4ec674a706 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nils=20O=2E=20Sel=C3=A5sdal?= Date: Tue, 16 Jun 2026 23:53:30 +0200 Subject: [PATCH] Refactor decommit to arena_trim --- src/arena.c | 19 +++++++++++++------ src/arena.h | 2 ++ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/arena.c b/src/arena.c index 3ca6661..2acbe07 100644 --- a/src/arena.c +++ b/src/arena.c @@ -128,12 +128,7 @@ void arena_reset_to(Arena *arena, U64 total_offset) ASAN_POISON_MEMORY_REGION(&block->base[block->first_free], memoryblock_available(block)); if ((arena->flags & ArenaFlag_NoDecommit) == 0) { - U32 aligned_pos = RoundUpToMultiple(block->first_free, arena->commit_size); - if (aligned_pos < block->committed_end) { - ASAN_UNPOISON_MEMORY_REGION(&block->base[aligned_pos], block->committed_end); - memory_decommit(&block->base[aligned_pos], block->committed_end - aligned_pos); - block->committed_end = aligned_pos; - } + arena_trim(arena); } break; @@ -143,6 +138,18 @@ void arena_reset_to(Arena *arena, U64 total_offset) } } +void arena_trim(Arena *arena) +{ + MemoryBlock *block = arena->current; + U32 aligned_pos = RoundUpToMultiple(block->first_free, arena->commit_size); + if (aligned_pos < block->committed_end) { + void *trim_start = &block->base[aligned_pos]; + // Note(nos): Should we unpoision ? + //ASAN_UNPOISON_MEMORY_REGION(trim_start, block->committed_end); + memory_decommit(trim_start, block->committed_end - aligned_pos); + block->committed_end = aligned_pos; + } + } ATemp arena_temp_begin(Arena *arena) { ATemp checkpoint = {}; diff --git a/src/arena.h b/src/arena.h index f2f64db..638ae11 100644 --- a/src/arena.h +++ b/src/arena.h @@ -54,6 +54,8 @@ void *arena_push(Arena *arena, U32 size, U32 align); // Invalid for arrays > U32 #define arena_push_array_of(arena, type, len) arena_push(arena, (U32) (sizeof(type) * (len)), alignof(type)) +void arena_trim(Arena *arena); + ATemp arena_temp_begin(Arena *arena); void arena_temp_end(ATemp *checkpoint); void arena_reset_to(Arena *arena, U64 total_offset);