summaryrefslogtreecommitdiff
path: root/arena.c
diff options
context:
space:
mode:
Diffstat (limited to 'arena.c')
-rw-r--r--arena.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/arena.c b/arena.c
new file mode 100644
index 0000000..03a1c1c
--- /dev/null
+++ b/arena.c
@@ -0,0 +1,38 @@
+#include "arena.h"
+#include "macros.h"
+#include "sys.h"
+
+struct arena alloc_arena(u64 capacity)
+{
+ /* TODO(pryazha): Find reasonable maximum capacity through testing */
+ assert(capacity <= (u64)gigabytes(16));
+ if (!capacity)
+ capacity = kilobytes(4);
+ void *memory = sys_alloc(capacity);
+ assert(memory);
+ return (struct arena){memory, capacity, 0};
+}
+
+void release_arena(struct arena *arena)
+{
+ assert(arena);
+ sys_free(arena->memory, arena->capacity);
+ arena->memory = 0;
+ arena->capacity = 0;
+ arena->used = 0;
+}
+
+void *push_arena(struct arena *arena, u64 size)
+{
+ assert(arena);
+ assert(arena->used + size <= arena->capacity);
+ void *memory = arena->memory + arena->used;
+ arena->used += size;
+ return memory;
+}
+
+void pop_arena(struct arena *arena, u64 size)
+{
+ assert(arena);
+ arena->used -= min(size, arena->used);
+}