Add pool alocator based on arena

This commit is contained in:
2026-06-12 21:39:16 +02:00
parent a21311de7b
commit cec0cd966b
3 changed files with 177 additions and 3 deletions
+95 -1
View File
@@ -191,12 +191,106 @@ void miniarena_test1(void)
}
typedef struct PoolTest PoolTest;
struct PoolTest{
U32 n;
char name[32];
PoolTest *next;
};
void apool_test(void)
{
Arena arena;
arena_init(&arena, ArenaOptions_Default);
APool *pool = apool_create_ex(&arena, 16, sizeof(PoolTest), alignof(PoolTest));
PoolTest *list = NULL;
for (U32 i = 0; i < U32_Max; i++) {
PoolTest *pt = apool_alloc(pool);
if (pt == NULL){
break;
}
pt->n = i;
pt->next = list;
list = pt;
}
for (PoolTest *p = list; p; p = p->next){
printf("Pooltest %u\n",p->n);
}
PoolTest *next;
U32 count = 0;
for (PoolTest *p = list; count < 7 && p; p = next){
count++;
next = p->next;
printf("Pooltest freeing %u\n",p->n);
apool_free(pool, p);
}
list = NULL;
for (U32 i = 0; i < U32_Max; i++) {
PoolTest *pt = apool_alloc(pool);
if (pt == NULL){
break;
}
pt->n = i;
pt->next = list;
list = pt;
}
for (PoolTest *p = list; p; p = p->next){
printf("Pooltest %u\n",p->n);
}
}
void apool_test_autogrow(void)
{
Arena arena;
arena_init(&arena, ArenaOptions_Default);
APool *pool = apool_create(&arena, APOOL_AUTOGROW, PoolTest);
PoolTest *list = NULL;
for (U32 i = 0; i < 4; i++) {
PoolTest *pt = apool_alloc(pool);
if (pt == NULL){
break;
}
pt->n = i;
pt->next = list;
list = pt;
}
for (PoolTest *p = list; p; p = p->next){
printf("Pooltest %u\n",p->n);
}
PoolTest *next;
U32 count = 0;
for (PoolTest *p = list; count < 3 && p; p = next){
count++;
next = p->next;
printf("Pooltest freeing %u\n",p->n);
apool_free(pool, p);
}
list = NULL;
for (U32 i = 0; i < 5; i++) {
PoolTest *pt = apool_alloc(pool);
if (pt == NULL){
break;
}
pt->n = i;
pt->next = list;
list = pt;
}
for (PoolTest *p = list; p; p = p->next){
printf("Pooltest %u\n",p->n);
}
}
int main(int argc, char *argv[])
{
// arena_test_1();
// arena_test_2();
// arena_test_3();
// arena_test_4();
miniarena_test1();
// miniarena_test1();
apool_test_autogrow();
}