diff options
Diffstat (limited to 'prb_arena.c')
-rw-r--r-- | prb_arena.c | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/prb_arena.c b/prb_arena.c new file mode 100644 index 0000000..1938dec --- /dev/null +++ b/prb_arena.c @@ -0,0 +1,48 @@ +Arena *alloc_arena(U64 cap) +{ + Arena *a; + + /* TODO(pryazha): Use OS specific memory allocator + * (like VirtualAlloc on Windows or mmap on Linux) + */ + a = malloc(sizeof(Arena)); + ASSERT(a); + + if (!cap) + cap = PRB_DEFAULT_ALLOC_SIZE; + + a->mem = malloc(cap); + ASSERT(a->mem); + a->cap = cap; + a->used = 0; + + return a; +} + +void release_arena(Arena *a) +{ + free(a->mem); + MEM0STRUCT(a); + free(a); +} + +void *push_arena(Arena *a, U64 size) +{ + ASSERT(a); + ASSERT(a->used+size <= a->cap); + + void *r; + + r = a->mem+a->used; + a->used += size; + + return r; +} + +void pop_arena(Arena *a, U64 size) +{ + ASSERT(a); + U64 clamped; + clamped = CLAMPTOP(size, a->used); + a->used = a->used-clamped; +} |