Fix commit at block end

This commit is contained in:
Nils O. Selåsdal
2026-06-09 02:05:50 +02:00
parent 6937d066a5
commit 7dfe547e19
2 changed files with 26 additions and 2 deletions
+2 -1
View File
@@ -25,7 +25,7 @@ MemoryBlock *memoryblock_allocate(size_t size, size_t commit_size)
void arena_init(Arena *arena, const ArenaParams *params) void arena_init(Arena *arena, const ArenaParams *params)
{ {
Assert(params->size > MemoryBlock_Header_Size); 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)); Assert(IsPow2(params->commit_size));
MemoryBlock *block = memoryblock_allocate(params->size, 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 // Commit more memory
U32 aligned_end_pos = AlignToPageEnd(start_pos + size); U32 aligned_end_pos = AlignToPageEnd(start_pos + size);
U32 aligned_size = RoundUpToMultiple(aligned_end_pos - block->committed_pos, arena->commit_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); memory_commit(&block->base[block->committed_pos], aligned_size);
block->committed_pos += aligned_size; block->committed_pos += aligned_size;
+24 -1
View File
@@ -44,6 +44,7 @@ static void arena_test_1(void)
arena_dump(&arena); arena_dump(&arena);
arena_free(&arena); arena_free(&arena);
} }
static void arena_test_2(void) static void arena_test_2(void)
{ {
ArenaParams arena_params = {}; ArenaParams arena_params = {};
@@ -92,8 +93,30 @@ static void arena_test_2(void)
arena_free(&arena); 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[]) int main(int argc, char *argv[])
{ {
//arena_test_1(); //arena_test_1();
arena_test_2(); //arena_test_2();
arena_test_3();
} }