From fef3dd609ab60a764a19863e0c9fe3bc7948be51 Mon Sep 17 00:00:00 2001 From: Krzosa Karol Date: Wed, 10 Jan 2024 07:35:01 +0100 Subject: [PATCH] Add "base_len" to memory arena so that bootstrap arena doesn't delete itself --- code/arena.c | 13 ++++++------- code/arena.h | 5 +++-- test/test_arena.cpp | 21 +++++++++++++++++++++ 3 files changed, 30 insertions(+), 9 deletions(-) diff --git a/code/arena.c b/code/arena.c index 5e366aa..ce88687 100644 --- a/code/arena.c +++ b/code/arena.c @@ -68,17 +68,14 @@ MA_StaticFunc uint8_t *MV__AdvanceCommit(MV_Memory *m, size_t *commit_size, size return result; } -MA_API void MA_DeallocateStub(MA_Arena *arena, void *p) {} - MA_API void MA_PopToPos(MA_Arena *arena, size_t pos) { - pos = MA_CLAMP_TOP(pos, arena->len); + MA_ASSERT(arena->len >= arena->base_len); + pos = MA_CLAMP(pos, arena->base_len, arena->len); arena->len = pos; } -MA_API void *MA_PopSize(MA_Arena *arena, size_t size) { - size = MA_CLAMP_TOP(size, arena->len); - arena->len -= size; - return arena->memory.data + arena->len; +MA_API void MA_PopSize(MA_Arena *arena, size_t size) { + MA_PopToPos(arena, arena->len - size); } MA_API void MA_DeallocateArena(MA_Arena *arena) { @@ -153,6 +150,7 @@ MA_API MA_Arena *MA_Bootstrap(void) { MA_Arena bootstrap_arena = {0}; MA_Arena *arena = MA_PushStruct(&bootstrap_arena, MA_Arena); *arena = bootstrap_arena; + arena->base_len = arena->len; return arena; } @@ -160,6 +158,7 @@ MA_API M_Allocator MA_BootstrapExclusive(void) { MA_Arena bootstrap_arena = {0}; MA_Arena *arena = MA_PushStruct(&bootstrap_arena, MA_Arena); *arena = bootstrap_arena; + arena->base_len = arena->len; return MA_GetExclusiveAllocator(arena); } diff --git a/code/arena.h b/code/arena.h index 28b1de4..94ec8ae 100644 --- a/code/arena.h +++ b/code/arena.h @@ -80,6 +80,8 @@ struct MA_Arena { MV_Memory memory; int alignment; size_t len; + size_t base_len; // When popping to 0 this is the minimum "len" value + // It's so that Bootstrapped arena won't delete itself when Reseting. #ifdef __cplusplus operator M_Allocator() { return {this, MA_AllocatorProc}; } @@ -130,9 +132,8 @@ MA_API MA_Checkpoint MA_Save(MA_Arena *arena); MA_API void MA_Load(MA_Checkpoint checkpoint); MA_API void MA_PopToPos(MA_Arena *arena, size_t pos); -MA_API void * MA_PopSize(MA_Arena *arena, size_t size); +MA_API void MA_PopSize(MA_Arena *arena, size_t size); MA_API void MA_DeallocateArena(MA_Arena *arena); -MA_API void MA_DeallocateStub(MA_Arena *arena, void *p); MA_API void MA_Reset(MA_Arena *arena); MA_API void MA_MemoryZero(void *p, size_t size); diff --git a/test/test_arena.cpp b/test/test_arena.cpp index b061d13..8f658f0 100644 --- a/test/test_arena.cpp +++ b/test/test_arena.cpp @@ -1,5 +1,25 @@ #include "../core.c" +void TestBootstrapArenaClear() { + MA_Arena *arena = MA_Bootstrap(); + IO_Assert(arena->base_len != 0); + + MA_PushSize(arena, 1024); + MA_Reset(arena); + + int *vals = MA_PushArray(arena, int, 1024); + for (int i = 0; i < 1024; i += 1) { + vals[i] = i; + } + + int *a = MA_PushStruct(arena, int); + *a = 1; + + for (int i = 0; i < 1024; i += 1) { + IO_Assert(vals[i] == i); + } +} + void TestScratch() { MA_Arena *scratch_arena_test = NULL; { @@ -76,4 +96,5 @@ int main() { TestCreateAllocate(); TestBootstrap(); TestBootstrapExclusive(); + TestBootstrapArenaClear(); } \ No newline at end of file