From 7686aae2667fffd798ee2f0dc7ca1252a36612c5 Mon Sep 17 00:00:00 2001 From: quou Date: Fri, 7 Feb 2025 00:27:11 +1100 Subject: arena pop --- qstd/memory.c | 15 +++++++++++++++ qstd/memory.h | 3 +++ 2 files changed, 18 insertions(+) (limited to 'qstd') diff --git a/qstd/memory.c b/qstd/memory.c index 7d669d2..87618f9 100644 --- a/qstd/memory.c +++ b/qstd/memory.c @@ -34,10 +34,12 @@ void init_arena( a->buf = mem; a->size = size; a->ptr = 0; + a->last_push = 0; } void clear_arena(Arena* a) { a->ptr = 0; + a->last_push = 0; } void* imp_arena_alloc( @@ -75,6 +77,19 @@ void* arena_alloc_aligned( return (void*)align_address((uintptr_t)p, align); } +void arena_push(Arena* a) { + int last = a->last_push, * prev; + a->last_push = a->ptr; + prev = arena_alloc(a, sizeof *prev); + *prev = last; +} + +void arena_pop(Arena* a) { + assert(a->last_push); + a->ptr -= a->last_push; + a->last_push = *(int*)&a->buf[a->ptr]; +} + void init_heap( Heap* h, void* mem, diff --git a/qstd/memory.h b/qstd/memory.h index a0b819a..d87dce6 100644 --- a/qstd/memory.h +++ b/qstd/memory.h @@ -13,6 +13,7 @@ void zero(void* buf, int size); typedef struct Arena { char* buf; int size, ptr; + int last_push; } Arena; void init_arena( @@ -30,6 +31,8 @@ void* arena_alloc_aligned( int size, int align ); +void arena_push(Arena* a); +void arena_pop(Arena* a); typedef struct Heap { char* buf; -- cgit v1.2.3-54-g00ecf