diff options
Diffstat (limited to 'qstd/memory.c')
-rw-r--r-- | qstd/memory.c | 15 |
1 files changed, 15 insertions, 0 deletions
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, |