Add pool alocator based on arena
This commit is contained in:
+55
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user