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