Add arena allocation header

This commit is contained in:
Abdelrahman Said 2024-03-24 13:55:13 +00:00
parent 49ce26a6c2
commit 08703b465c

View File

@ -11,6 +11,18 @@
#define DEFAULT_ALIGNMENT (2 * sizeof(void *))
#endif /* ifndef DEFAULT_ALIGNMENT */
#define HDR_MAGIC_BYTE_COUNT 8
#define HDR_MAGIC \
{ 0x57, 0x41, 0x41, 0x52, 0x4e, 0x48, 0x44, 0x52 }
typedef struct arena_alloc_hdr ArenaAllocHDR;
struct arena_alloc_hdr {
u8 magic[HDR_MAGIC_BYTE_COUNT];
u64 alloc_size;
u64 alignment;
u8 *alloc_start;
};
typedef struct base_arena BaseArena;
struct base_arena {
u8 *buf;
@ -31,6 +43,7 @@ internal void *base_arena_alloc_aligned(BaseArena *arena, u64 size,
u64 alignment);
internal void base_arena_clear(BaseArena *arena);
internal void base_arena_free(BaseArena *arena);
internal ArenaAllocHDR *find_alloc_header(BaseArena *arena, void *alloc_ptr);
// PUBLIC API
@ -113,7 +126,7 @@ void wapp_mem_arena_clear(Arena *arena) {
while (arena->active_arena) {
base_arena_clear(arena->active_arena);
last_active = arena->active_arena;
last_active = arena->active_arena;
arena->active_arena = arena->active_arena->prev;
}
@ -192,12 +205,23 @@ internal void *base_arena_alloc_aligned(BaseArena *arena, u64 size,
return NULL;
}
u8 *output = wapp_mem_util_align_forward((void *)(arena->offset), alignment);
u8 *start_offset = arena->offset;
u8 *alloc_start = arena->offset + sizeof(ArenaAllocHDR);
u8 *output = wapp_mem_util_align_forward((void *)alloc_start, alignment);
if (output + size >= arena->buf + arena->capacity) {
return NULL;
}
arena->offset += size;
ArenaAllocHDR *header = (ArenaAllocHDR *)start_offset;
*header = (ArenaAllocHDR){
.magic = HDR_MAGIC,
.alloc_size = size,
.alignment = alignment,
.alloc_start = output,
};
arena->offset = output + size;
return (void *)output;
}
@ -224,3 +248,5 @@ internal void base_arena_free(BaseArena *arena) {
arena->capacity = 0;
arena->prev = arena->next = NULL;
}
internal ArenaAllocHDR *find_alloc_header(BaseArena *arena, void *alloc_ptr) {}