summaryrefslogtreecommitdiff
path: root/source/base/base_arena.h
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.h
parent078e21a1feb811f9ef7797ce3ee5d2e8ffcccfce (diff)
feature(base): refactored the base library. removed some files etc and did stuff
Diffstat (limited to 'source/base/base_arena.h')
-rwxr-xr-xsource/base/base_arena.h143
1 files changed, 143 insertions, 0 deletions
diff --git a/source/base/base_arena.h b/source/base/base_arena.h
index dc6dd73..d24eeea 100755
--- a/source/base/base_arena.h
+++ b/source/base/base_arena.h
@@ -29,3 +29,146 @@ struct temp_arena
29}; 29};
30 30
31#endif /* BASE_ARENA_H */ 31#endif /* BASE_ARENA_H */
32
33#ifdef BASE_IMPLEMENTATION
34internal mem_arena *
35arena_create(u64 capacity)
36{
37 mem_arena *arena = (mem_arena *)mmap(
38 /* kernel decides where to throw the arena */
39 NULL,
40 capacity + sizeof(mem_arena),
41 PROT_READ | PROT_WRITE,
42 MAP_SHARED | MAP_ANONYMOUS,
43 -1,
44 0);
45
46 if (arena == MAP_FAILED)
47 {
48 return NULL;
49 }
50
51 arena->capacity = capacity;
52 arena->base_position = (u8 *)arena + sizeof(mem_arena);
53 arena->current_position = 0;
54 arena->previous_position = 0;
55
56 return arena;
57}
58
59internal void
60arena_destroy(mem_arena *arena)
61{
62 if (!arena)
63 {
64 return;
65 }
66 munmap(arena, arena->capacity + sizeof(mem_arena));
67}
68internal void *
69arena_alloc(mem_arena *arena, u64 size, b32 zero)
70{
71 if (!arena)
72 {
73 return NULL;
74 }
75 u64 aligned = Align(arena->current_position, ARENA_ALIGN);
76 u64 new_pos = aligned + size;
77 if (new_pos > arena->capacity)
78 {
79 return NULL;
80 }
81
82 void *out = arena->base_position + aligned;
83
84 arena->previous_position = arena->current_position;
85 arena->current_position = aligned + size;
86
87 if (zero) MemSet(out, size);
88
89 return out;
90}
91
92internal void
93arena_pop(mem_arena *arena, u64 size)
94{
95 size = MIN(size, arena->current_position);
96 arena->current_position -= size;
97}
98
99internal void
100arena_pop_to(mem_arena *arena, u64 pos)
101{
102 u64 size = pos < arena->current_position ? arena->current_position - pos : 0;
103 arena_pop(arena, size);
104}
105
106internal void
107arena_clear(mem_arena *arena)
108{
109 arena->current_position = 0;
110}
111
112internal mem_arena *
113arena_resize_align(mem_arena *arena, void *old_memory, u64 new_size, u64 old_size, umm alignment)
114{
115 u8 *old_mem = (u8 *)old_memory;
116
117 if (!is_pow(alignment))
118 {
119 Align(arena->current_position, alignment);
120 }
121
122 if (old_memory == NULL || old_size == 0)
123 {
124 return (mem_arena *)arena_alloc(arena, new_size, 0);
125 }
126 else if ((old_mem >= arena->base_position && old_mem < arena->base_position + arena->capacity))
127 {
128 if ((arena->base_position + arena->previous_position) == old_memory)
129 {
130 arena->current_position = arena->previous_position + new_size;
131 if (new_size > old_size)
132 {
133 MemSet(&arena->current_position, new_size - old_size);
134 }
135 return (mem_arena *)old_memory;
136 }
137 else
138 {
139 void *new_memory = arena_alloc(arena, new_size, 0);
140 umm copy_size = old_size < new_size ? old_size : new_size;
141 memmove(new_memory, old_mem, copy_size);
142 }
143 }
144 else
145 {
146 // warn(0);
147 }
148
149 return NULL;
150}
151
152internal mem_arena *
153arena_resize(mem_arena *arena, void *old_memory, u64 new_size, u64 old_size)
154{
155 return arena_resize_align(arena, old_memory, new_size, old_size, ARENA_ALIGN);
156}
157
158internal temp_arena
159temp_arena_begin(mem_arena *arena)
160{
161 temp_arena t;
162 t.arena = arena;
163 t.start_position = arena->current_position;
164
165 return t;
166}
167
168internal void
169temp_arena_end(temp_arena temp)
170{
171 temp.arena->current_position = temp.start_position;
172}
173
174#endif