diff --git a/src/arena.c b/src/arena.c index 81ec05a..852b4dd 100644 --- a/src/arena.c +++ b/src/arena.c @@ -35,6 +35,7 @@ Arena *arena_alloc_(const ArenaParams *params) arena->pos = ARENA_HEADER_SZ; arena->base_pos = 0; arena->prev = NULL; + arena->checkpoint_level = 0; return arena; } @@ -113,7 +114,7 @@ ArenaCheckPoint arena_temp_begin(Arena *arena) ArenaCheckPoint checkpoint = {}; checkpoint.arena = arena; checkpoint.absolute_pos = arena_absolute_pos(arena); - + arena->checkpoint_level++; return checkpoint; } @@ -121,4 +122,11 @@ void arena_temp_end(ArenaCheckPoint *checkpoint) { Arena *arena = checkpoint->arena; arena_pop_to(arena, checkpoint->absolute_pos); + Assert(arena->checkpoint_level > 0); + arena->checkpoint_level--; +} + +void arena_reset(Arena *arena) +{ + arena_pop_to(arena, 0); } diff --git a/src/arena.h b/src/arena.h index d196913..fb21cea 100644 --- a/src/arena.h +++ b/src/arena.h @@ -21,6 +21,7 @@ struct Arena { U32 base_pos; // absolute position of base relative to the first linked arena ArenaFlags flags; Arena *prev; + S32 checkpoint_level; }; typedef struct ArenaCheckPoint ArenaCheckPoint; @@ -45,3 +46,4 @@ void *arena_push(Arena *arena, U32 size, U32 align); ArenaCheckPoint arena_temp_begin(Arena *arena); void arena_temp_end(ArenaCheckPoint *checkpoint); void arena_pop_to(Arena *arena, U32 abs_pos); +void arena_reset(Arena *arena);