Add arena allocation header
This commit is contained in:
parent
49ce26a6c2
commit
08703b465c
@ -11,6 +11,18 @@
|
|||||||
#define DEFAULT_ALIGNMENT (2 * sizeof(void *))
|
#define DEFAULT_ALIGNMENT (2 * sizeof(void *))
|
||||||
#endif /* ifndef DEFAULT_ALIGNMENT */
|
#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;
|
typedef struct base_arena BaseArena;
|
||||||
struct base_arena {
|
struct base_arena {
|
||||||
u8 *buf;
|
u8 *buf;
|
||||||
@ -31,6 +43,7 @@ internal void *base_arena_alloc_aligned(BaseArena *arena, u64 size,
|
|||||||
u64 alignment);
|
u64 alignment);
|
||||||
internal void base_arena_clear(BaseArena *arena);
|
internal void base_arena_clear(BaseArena *arena);
|
||||||
internal void base_arena_free(BaseArena *arena);
|
internal void base_arena_free(BaseArena *arena);
|
||||||
|
internal ArenaAllocHDR *find_alloc_header(BaseArena *arena, void *alloc_ptr);
|
||||||
|
|
||||||
// PUBLIC API
|
// PUBLIC API
|
||||||
|
|
||||||
@ -113,7 +126,7 @@ void wapp_mem_arena_clear(Arena *arena) {
|
|||||||
while (arena->active_arena) {
|
while (arena->active_arena) {
|
||||||
base_arena_clear(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;
|
arena->active_arena = arena->active_arena->prev;
|
||||||
}
|
}
|
||||||
@ -192,12 +205,23 @@ internal void *base_arena_alloc_aligned(BaseArena *arena, u64 size,
|
|||||||
return NULL;
|
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) {
|
if (output + size >= arena->buf + arena->capacity) {
|
||||||
return NULL;
|
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;
|
return (void *)output;
|
||||||
}
|
}
|
||||||
@ -224,3 +248,5 @@ internal void base_arena_free(BaseArena *arena) {
|
|||||||
arena->capacity = 0;
|
arena->capacity = 0;
|
||||||
arena->prev = arena->next = NULL;
|
arena->prev = arena->next = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal ArenaAllocHDR *find_alloc_header(BaseArena *arena, void *alloc_ptr) {}
|
||||||
|
Loading…
Reference in New Issue
Block a user