apool: track total&free elements

This commit is contained in:
2026-09-14 19:55:23 +02:00
parent 9ed137abcb
commit 076b152555
3 changed files with 83 additions and 51 deletions
+26 -20
View File
@@ -1,33 +1,35 @@
#include "pool.h"
APool *apool_create_ex(Allocator *allocator, U32 n_elements, U32 element_size, U32 element_align)
APool *apool_create_ex(Allocator *allocator, const APoolCreateOptions *options)
{
Assert(IsPow2(element_align));
U32 align = element_align;
Assert(IsPow2(options->element_align));
U32 element_align = options->element_align;
if (element_align < alignof(APoolElement)) {
element_align = alignof(APoolElement);
}
U32 size = AlignUp(element_size, element_align);
U32 element_size = AlignUp(options->element_size, options->element_align);
APool *pool = allocator_push_type(allocator, APool);
Assert(pool != NULL);
pool->align = align;
pool->element_size = size;
pool->allocator = allocator;
pool->n_elements = n_elements;
pool->free_list = NULL;
pool->start = NULL;
pool->element_align= element_align;
pool->element_size = element_size;
pool->allocator = allocator;
pool->n_elements = 0;
pool->n_free = 0;
pool->free_list = NULL;
pool->flags = options->flags;
if (size != APOOL_AUTOGROW) {
Assert(n_elements <= U32_Max / size );
U32 total_size = n_elements * size;
U8 * start = allocator_push(allocator, total_size, align);
for (U32 i = 0; i < total_size; i += size) {
if (options->n_reserved != 0) {
Assert(options->n_reserved <= U32_Max / element_size );
U32 total_size = options->n_reserved * element_size;
U8 *start = allocator_push(allocator, total_size, element_align);
for (U32 i = 0; i < total_size; i += element_size) {
APoolElement *element = (APoolElement *)&start[i];
element->next = pool->free_list;
pool->free_list = element;
pool->n_elements++;
}
pool->start = start;
pool->n_free = pool->n_elements;
}
return pool;
@@ -38,8 +40,12 @@ 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 = allocator_push(pool->allocator, pool->element_size, pool->align);
pool->n_free--;
} else if((pool->flags & APoolFlag_AutoGrow) != 0) {
element = allocator_push(pool->allocator, pool->element_size, pool->element_align);
if (element != NULL) {
pool->n_elements++;
}
}
return element;
@@ -48,10 +54,10 @@ void *apool_alloc(APool *pool)
void apool_free(APool *pool, void *ptr)
{
if (ptr != NULL) {
Assert((U8 *)ptr >= pool->start);
APoolElement *element = (APoolElement *)ptr;
element->next = pool->free_list;
pool->free_list = element;
pool->n_free++;
}
}