Add pool alocator based on arena

This commit is contained in:
Nils O. Selåsdal
2026-06-12 21:39:16 +02:00
parent a21311de7b
commit cec0cd966b
3 changed files with 177 additions and 3 deletions
+55
View File
@@ -154,3 +154,58 @@ void arena_reset(Arena *arena)
{
arena_reset_to(arena, 0);
}
// Pool
APool *apool_create_ex(Arena *arena, U32 n_elements, U32 element_size, U32 element_align)
{
Assert(IsPow2(element_align));
U32 align = element_align;
if (element_align < alignof(APoolElement)) {
element_align = alignof(APoolElement);
}
U32 size = AlignUp(element_size, element_align);
APool *pool = arena_push_type(arena, APool);
pool->align = align;
pool->element_size = size;
pool->arena = arena;
pool->n_elements = n_elements;
pool->free_list = NULL;
pool->start == NULL;
if (size != APOOL_AUTOGROW) {
U32 total_size = n_elements * size; // Note(nos): guard against unreasonable sizes
U8 * start = arena_push(arena, total_size, align);
for (U32 i = 0; i < total_size; i += size) {
APoolElement *element = (APoolElement *)&start[i];
element->next = pool->free_list;
pool->free_list = element;
}
pool->start = start;
}
return pool;
}
void *apool_alloc(APool *pool)
{
APoolElement *element = pool->free_list;
if (element != NULL) {
pool->free_list = element->next;
} else if(pool->n_elements == APOOL_AUTOGROW) {
element = arena_push(pool->arena, pool->element_size, pool->align);
}
return element;
}
void apool_free(APool *pool, void *ptr)
{
if (ptr != NULL) {
APoolElement *element = (APoolElement *)ptr;
element->next = pool->free_list;
pool->free_list = element;
}
}