From 08703b465c2effc405415bf44597959680c8b691 Mon Sep 17 00:00:00 2001
From: Abdelrahman Said <said.abdelrahman@flawlessai.com>
Date: Sun, 24 Mar 2024 13:55:13 +0000
Subject: [PATCH] Add arena allocation header

---
 mem/src/arena/mem_arena.c | 32 +++++++++++++++++++++++++++++---
 1 file changed, 29 insertions(+), 3 deletions(-)

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) {}