summaryrefslogtreecommitdiff
path: root/source/base/base_arena.c
diff options
context:
space:
mode:
authornasr <nsrddyn@gmail.com>2026-04-19 18:38:22 +0200
committernasr <nsrddyn@gmail.com>2026-04-19 18:38:22 +0200
commit36dc1f859a13e428c441fc8f4f35550fe12ed72f (patch)
treee8a98a43ccbd8b989427dc529dbdf37b2f942f9a /source/base/base_arena.c
parent078e21a1feb811f9ef7797ce3ee5d2e8ffcccfce (diff)
feature(base): refactored the base library. removed some files etc and did stuff
Diffstat (limited to 'source/base/base_arena.c')
-rw-r--r--[-rwxr-xr-x]source/base/base_arena.c139
1 files changed, 0 insertions, 139 deletions
diff --git a/source/base/base_arena.c b/source/base/base_arena.c
index 8fc8c13..e69de29 100755..100644
--- a/source/base/base_arena.c
+++ b/source/base/base_arena.c
@@ -1,139 +0,0 @@
1internal mem_arena *
2arena_create(u64 capacity)
3{
4 mem_arena *arena = (mem_arena *)mmap(
5 /* kernel decides where to throw the arena */
6 NULL,
7 capacity + sizeof(mem_arena),
8 PROT_READ | PROT_WRITE,
9 MAP_SHARED | MAP_ANONYMOUS,
10 -1,
11 0);
12
13 if (arena == MAP_FAILED)
14 {
15 return NULL;
16 }
17
18 arena->capacity = capacity;
19 arena->base_position = (u8 *)arena + sizeof(mem_arena);
20 arena->current_position = 0;
21 arena->previous_position = 0;
22
23 return arena;
24}
25
26internal void
27arena_destroy(mem_arena *arena)
28{
29 if (!arena)
30 {
31 return;
32 }
33 munmap(arena, arena->capacity + sizeof(mem_arena));
34}
35internal void *
36arena_alloc(mem_arena *arena, u64 size, b32 zero)
37{
38 if (!arena)
39 {
40 return NULL;
41 }
42 u64 aligned = Align(arena->current_position, ARENA_ALIGN);
43 u64 new_pos = aligned + size;
44 if (new_pos > arena->capacity)
45 {
46 return NULL;
47 }
48
49 void *out = arena->base_position + aligned;
50
51 arena->previous_position = arena->current_position;
52 arena->current_position = aligned + size;
53
54 if (zero) MemSet(out, size);
55
56 return out;
57}
58
59internal void
60arena_pop(mem_arena *arena, u64 size)
61{
62 size = MIN(size, arena->current_position);
63 arena->current_position -= size;
64}
65
66internal void
67arena_pop_to(mem_arena *arena, u64 pos)
68{
69 u64 size = pos < arena->current_position ? arena->current_position - pos : 0;
70 arena_pop(arena, size);
71}
72
73internal void
74arena_clear(mem_arena *arena)
75{
76 arena->current_position = 0;
77}
78
79internal mem_arena *
80arena_resize_align(mem_arena *arena, void *old_memory, u64 new_size, u64 old_size, umm alignment)
81{
82 u8 *old_mem = (u8 *)old_memory;
83
84 if (!is_pow(alignment))
85 {
86 Align(arena->current_position, alignment);
87 }
88
89 if (old_memory == NULL || old_size == 0)
90 {
91 return (mem_arena *)arena_alloc(arena, new_size, 0);
92 }
93 else if ((old_mem >= arena->base_position && old_mem < arena->base_position + arena->capacity))
94 {
95 if ((arena->base_position + arena->previous_position) == old_memory)
96 {
97 arena->current_position = arena->previous_position + new_size;
98 if (new_size > old_size)
99 {
100 MemSet(&arena->current_position, new_size - old_size);
101 }
102 return (mem_arena *)old_memory;
103 }
104 else
105 {
106 void *new_memory = arena_alloc(arena, new_size, 0);
107 umm copy_size = old_size < new_size ? old_size : new_size;
108 memmove(new_memory, old_mem, copy_size);
109 }
110 }
111 else
112 {
113 // warn(0);
114 }
115
116 return NULL;
117}
118
119internal mem_arena *
120arena_resize(mem_arena *arena, void *old_memory, u64 new_size, u64 old_size)
121{
122 return arena_resize_align(arena, old_memory, new_size, old_size, ARENA_ALIGN);
123}
124
125internal temp_arena
126temp_arena_begin(mem_arena *arena)
127{
128 temp_arena t;
129 t.arena = arena;
130 t.start_position = arena->current_position;
131
132 return t;
133}
134
135internal void
136temp_arena_end(temp_arena temp)
137{
138 temp.arena->current_position = temp.start_position;
139}