From 7dfe547e1918ecbb15495e8e15af4d2567584997 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nils=20O=2E=20Sel=C3=A5sdal?= Date: Tue, 9 Jun 2026 02:05:50 +0200 Subject: [PATCH] Fix commit at block end --- src/arena.c | 3 ++- src/main.c | 25 ++++++++++++++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/arena.c b/src/arena.c index fecfe81..dbbc3ed 100644 --- a/src/arena.c +++ b/src/arena.c @@ -25,7 +25,7 @@ MemoryBlock *memoryblock_allocate(size_t size, size_t commit_size) void arena_init(Arena *arena, const ArenaParams *params) { Assert(params->size > MemoryBlock_Header_Size); - Assert(params->size < (U32_Max - Max(params->commit_size, platform_page_size()))); // Reserving last piece so our math doesn't overflow + Assert(params->size < (U32_Max - platform_page_size())); // Reserving last piece so our math doesn't overflow Assert(IsPow2(params->commit_size)); MemoryBlock *block = memoryblock_allocate(params->size, params->commit_size); @@ -84,6 +84,7 @@ void *arena_push(Arena *arena, U32 size, U32 align) // Commit more memory U32 aligned_end_pos = AlignToPageEnd(start_pos + size); U32 aligned_size = RoundUpToMultiple(aligned_end_pos - block->committed_pos, arena->commit_size); + aligned_size = Min(aligned_size, block->size - block->committed_pos); // Note(nos): Is this actually right ? memory_commit(&block->base[block->committed_pos], aligned_size); block->committed_pos += aligned_size; diff --git a/src/main.c b/src/main.c index 3f9c7fc..41de530 100644 --- a/src/main.c +++ b/src/main.c @@ -44,6 +44,7 @@ static void arena_test_1(void) arena_dump(&arena); arena_free(&arena); } + static void arena_test_2(void) { ArenaParams arena_params = {}; @@ -92,8 +93,30 @@ static void arena_test_2(void) arena_free(&arena); } +static void arena_test_3(void) +{ + ArenaParams arena_params = {}; + U32 arena_size = KB(97) + MemoryBlock_Header_Size; + U32 commit_size = KB(32); + arena_params.size = arena_size; + arena_params.commit_size = commit_size; + Arena arena; + arena_init(&arena, &arena_params); + arena_dump(&arena); + void *ptr = arena_push(&arena, KB(64), 32); + MemoryZero(ptr, KB(64)); + printf("Allocated ptr %p\n", ptr); + arena_dump(&arena); + ptr = arena_push(&arena, KB(97) - KB(64), 32); + MemoryZero(ptr, KB(97) - KB(64)); + printf("Allocated ptr %p\n", ptr); + arena_dump(&arena); + arena_free(&arena); +} + int main(int argc, char *argv[]) { //arena_test_1(); - arena_test_2(); + //arena_test_2(); + arena_test_3(); }