summaryrefslogtreecommitdiff
path: root/prb_memory.c
diff options
context:
space:
mode:
authorpryazha <pryadeiniv@mail.ru>2025-02-20 15:08:47 +0500
committerpryazha <pryadeiniv@mail.ru>2025-02-20 15:08:47 +0500
commit0bd7c5dc0725a4882cb33c5d8f1a3b101d4025cd (patch)
treeecb3e42bf4855ba9e4836a20b94cb4857943eda6 /prb_memory.c
initial
Diffstat (limited to 'prb_memory.c')
-rw-r--r--prb_memory.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/prb_memory.c b/prb_memory.c
new file mode 100644
index 0000000..4bceccc
--- /dev/null
+++ b/prb_memory.c
@@ -0,0 +1,42 @@
+Arena *arena_alloc(U64 cap)
+{
+ Arena *arena = 0;
+
+ /* TODO(pryazha): Use OS related memory allocator (like VirtualAlloc on Windows) */
+ arena = malloc(sizeof(Arena));
+ Assert(arena);
+
+ if (!cap)
+ cap = DEFAULT_ALLOC_SIZE;
+
+ arena->mem = malloc(cap);
+ Assert(arena->mem);
+ arena->cap = cap;
+ arena->used = 0;
+
+ return arena;
+}
+
+void arena_release(Arena *arena)
+{
+ free(arena->mem);
+ arena->mem = 0;
+ arena->cap = 0;
+ arena->used = 0;
+ free(arena);
+}
+
+void *arena_push(Arena *arena, U64 size)
+{
+ Assert(arena->used+size <= arena->cap);
+ void *r = arena->mem+arena->used;
+ arena->used += size;
+ return r;
+}
+
+void arena_pop(Arena *arena, U64 amount)
+{
+ Assert(arena);
+ U64 clamped = ClampTop(amount, arena->used);
+ arena->used = arena->used-clamped;
+}