diff --git a/mem/src/arena/mem_arena.c b/mem/src/arena/mem_arena.c index f59127d..dbc20ba 100644 --- a/mem/src/arena/mem_arena.c +++ b/mem/src/arena/mem_arena.c @@ -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) {}