taisei/src/objectpool.c

56 lines
1.2 KiB
C
Raw Normal View History

2017-12-20 19:53:09 +01:00
/*
* This software is licensed under the terms of the MIT License.
2017-12-20 19:53:09 +01:00
* See COPYING for further information.
* ---
2024-05-16 23:30:41 +02:00
* Copyright (c) 2011-2024, Lukas Weber <laochailan@web.de>.
* Copyright (c) 2012-2024, Andrei Alexeyev <akari@taisei-project.org>.
2017-12-20 19:53:09 +01:00
*/
2017-12-13 20:05:12 +01:00
#include "objectpool.h"
#include "memory/arena.h"
void objpool_init(
ObjectPool *pool,
const char *tag,
MemArena *arena,
size_t obj_size,
size_t obj_align
) {
*pool = (ObjectPool) {
.arena = arena,
.obj_size = obj_size,
.obj_align = obj_align,
.tag = tag,
};
}
2019-04-12 10:36:40 +02:00
void *objpool_acquire(ObjectPool *pool) {
ObjHeader *obj = pool->free_objects;
2017-12-13 20:05:12 +01:00
if(obj) {
assert(pool->num_used < pool->num_allocated);
2019-04-12 10:36:40 +02:00
pool->free_objects = obj->next;
} else {
assert(pool->num_used == pool->num_allocated);
obj = marena_alloc_aligned(pool->arena, pool->obj_size, pool->obj_align);
++pool->num_allocated;
}
memset(obj, 0, pool->obj_size);
++pool->num_used;
assert(pool->num_used <= pool->num_allocated);
return obj;
2017-12-13 20:05:12 +01:00
}
2019-04-12 10:36:40 +02:00
void objpool_release(ObjectPool *pool, void *object) {
ObjHeader *obj = object;
obj->next = pool->free_objects;
pool->free_objects = obj;
2017-12-13 20:05:12 +01:00
--pool->num_used;
assert(pool->num_used >= 0);
assert(pool->num_used <= pool->num_allocated);
}