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);