summaryrefslogtreecommitdiff
path: root/library/arena.c
diff options
context:
space:
mode:
Diffstat (limited to 'library/arena.c')
-rw-r--r--library/arena.c81
1 files changed, 0 insertions, 81 deletions
diff --git a/library/arena.c b/library/arena.c
deleted file mode 100644
index 39711d5..0000000
--- a/library/arena.c
+++ /dev/null
@@ -1,81 +0,0 @@
1#include <assert.h>
2#include <dirent.h>
3#include <fcntl.h>
4#include <stdint.h>
5#include <string.h>
6#include <sys/mman.h>
7#include <sys/stat.h>
8#include <unistd.h>
9
10#include "arena.h"
11
12mem_arena *
13arena_create(u64 capacity)
14{
15 mem_arena *arena = mmap(0, capacity, PROT_READ | PROT_WRITE | PROT_EXEC,
16 MAP_SHARED | MAP_ANONYMOUS, -1, 0);
17 if (arena == MAP_FAILED)
18 {
19 assert(0);
20 }
21
22 arena->capacity = capacity;
23 arena->pos = ARENA_BASE_POS;
24
25 return arena;
26}
27
28// make it a void pointer to allow implicit conversion
29void
30arena_destroy(mem_arena *arena)
31{
32 munmap(arena, arena->capacity);
33}
34
35void *
36arena_push(mem_arena *arena, u64 size, b32 non_zero)
37{
38 u64 pos_aligned = ALIGN_UP_POW2(arena->pos, ARENA_ALIGN);
39 u64 new_pos = pos_aligned + size;
40
41 if (new_pos > arena->capacity)
42 {
43 assert(0);
44 return NULL;
45 }
46
47 arena->pos = new_pos;
48 // cast to u8 to be able to do pointer arithemtic
49 u8 *out = (u8 *)arena + pos_aligned;
50
51 if (!non_zero)
52 {
53 memset(out, 0, size);
54 }
55 return out;
56}
57void
58arena_pop(mem_arena *arena, u64 size)
59{
60 size = MIN(size, arena->pos - ARENA_BASE_POS);
61 arena->pos -= size;
62}
63
64void
65arena_pop_to(mem_arena *arena, u64 pos)
66{
67 u64 size = pos < arena->pos ? arena->pos - pos : 0;
68 arena_pop(arena, size);
69}
70
71void
72arena_clear(mem_arena *arena)
73{
74 arena_pop_to(arena, ARENA_BASE_POS);
75}
76
77#define PUSH_STRUCT(arena, T) (T *)arena_push((arena), sizeof(T), 0)
78#define PUSH_STRUCT_NZ(arena, T) (T *)arena_push((arena), sizeof(T), 1)
79#define PUSH_ARRAY(arena, T, n) (T *)arena_push((arena), sizeof(T) * (n), 0)
80#define PUSH_ARRAY_NZ(arena, T, n) (T *)arena_push((arena), sizeof(T) * (n), 1)
81