summaryrefslogtreecommitdiff
path: root/prb_arena.c
diff options
context:
space:
mode:
Diffstat (limited to 'prb_arena.c')
-rw-r--r--prb_arena.c48
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;
+}