From e7e2829a631903dab6cb03542cb8338855dd0191 Mon Sep 17 00:00:00 2001 From: tijani Date: Mon, 5 Aug 2024 01:34:05 -0500 Subject: [PATCH] Definitions for arena memory management. --- src/base/base_arena.h | 58 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 src/base/base_arena.h diff --git a/src/base/base_arena.h b/src/base/base_arena.h new file mode 100644 index 0000000..29943a7 --- /dev/null +++ b/src/base/base_arena.h @@ -0,0 +1,58 @@ +#ifndef BASE_ARENA_H +#define BASE_ARENA_H + +// Constants +#define ARENA_HEADER_SIZE 64 + +// Types +typedef u32 ArenaFlags; +enum { ArenaFlag_NoChain = (1 << 0); ArenaFlag_LargePages = (1 << 1); }; + +typedef struct ArenaParams ArenaParams; +struct ArenaParams { + ArenaFlags flags; + u64 reserve_size; + u64 commite_size; + void *optional_backing_buffer; // NOTE(tijani): ?? +}; + +typedef struct Arena Arena; +struct Arena { + Arena *previous; // Previous arena in the chain + Arena *current; // Current arena in the chain + ArenaFlags flags; + u32 commit_size; + u64 reserve_size; + u64 base_position; + u64 position; + u64 commit; + u64 reserve; +}; + +typedef struct Temp Temp; +struct Temp { + Arena *arena; + u64 position; +}; + +// creation, destruction +internal Arena *arena_alloc_(ArenaParams *params); +#define arena_alloc(...) arena_alloc_(&(ArenaParams){.reserve_size = MB(64), .commit_size = KB(64), __VA_ARGS__}) +internal void arena_releas(Arena *arena); + +// push, pop operations +internal void *arena_psuh(Arena *arena, u64 size, u64 align); +internal u64 arena_position(Arena *arena); +internal void arena_pop_to(Arena *arena, u64 position); +internal void arena_clear(Arena *arena); +internal void arena_pop(Arena *arena, u64 amount); +#define push_array_no_zero_aligned(a, T, c, align) (T *)arena_push((a), sizeof(T) * (c), (align)) +#define push_array_aligned(a, T, c, align) (T *)MemoryZero(push_array_no_zero_aligned(a, T, c, align), sizeof(T) * (c)) +#define push_array_no_zero(a, T, c) push_array_no_zero_aligned(a, T, c, Max(8, Align_Of(T))) +#define push_array(a, T, c) push_array_aligned(a, T, c, Max(8, Align_Of(T))) + +// Temp +internal Temp temp_begin(Arena *arena); +internal void temp_end(Temp temp); + +#endif // BASE_ARENA_H