Add object pool
This commit is contained in:
@@ -37,6 +37,7 @@ set(BreezeSources
|
|||||||
|
|
||||||
breeze/utils/array.c
|
breeze/utils/array.c
|
||||||
breeze/utils/heap.c
|
breeze/utils/heap.c
|
||||||
|
breeze/utils/object_pool.c
|
||||||
breeze/utils/tokenizer.c
|
breeze/utils/tokenizer.c
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -51,6 +52,7 @@ set(BreezeHeaders
|
|||||||
|
|
||||||
breeze/utils/array.h
|
breeze/utils/array.h
|
||||||
breeze/utils/heap.h
|
breeze/utils/heap.h
|
||||||
|
breeze/utils/object_pool.h
|
||||||
breeze/utils/string.h
|
breeze/utils/string.h
|
||||||
breeze/utils/tokenizer.h
|
breeze/utils/tokenizer.h
|
||||||
|
|
||||||
|
|||||||
61
engine/breeze/utils/object_pool.c
Normal file
61
engine/breeze/utils/object_pool.c
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
#include "object_pool.h"
|
||||||
|
|
||||||
|
#include "../core/memory.h"
|
||||||
|
|
||||||
|
typedef struct BzObjectPool {
|
||||||
|
void *objects;
|
||||||
|
size_t stride;
|
||||||
|
size_t numObjects;
|
||||||
|
i32 firstFree;
|
||||||
|
} BzObjectPool;
|
||||||
|
|
||||||
|
static i32 *bzObjectPoolGetObject(const BzObjectPool *pool, size_t idx) {
|
||||||
|
return (i32 *) ((u8 *) pool->objects + idx * pool->stride);
|
||||||
|
}
|
||||||
|
|
||||||
|
BzObjectPool *bzObjectPoolCreate(const BzObjectPoolDesc *desc) {
|
||||||
|
BZ_ASSERT(desc->objectSize > 0);
|
||||||
|
|
||||||
|
// NOTE: Since object bits are used as a free list
|
||||||
|
// when not in use, we must ensure they can hold i32.
|
||||||
|
size_t stride = desc->objectSize;
|
||||||
|
if (stride < sizeof(i32)) {
|
||||||
|
stride = sizeof(i32);
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t numBytes = sizeof(BzObjectPool) + desc->numObjects * stride;
|
||||||
|
BzObjectPool *pool = bzAlloc(numBytes);
|
||||||
|
*pool = (BzObjectPool) {
|
||||||
|
.objects=pool + 1,
|
||||||
|
.stride=stride,
|
||||||
|
.numObjects=desc->numObjects,
|
||||||
|
.firstFree=0,
|
||||||
|
};
|
||||||
|
|
||||||
|
// Link free list
|
||||||
|
for (size_t i = 0; i < pool->numObjects - 1; i++) {
|
||||||
|
i32 *object = bzObjectPoolGetObject(pool, i);
|
||||||
|
*object = (i32) (i + 1);
|
||||||
|
}
|
||||||
|
i32 *lastObject = bzObjectPoolGetObject(pool, pool->numObjects - 1);
|
||||||
|
*lastObject = -1;
|
||||||
|
|
||||||
|
return pool;
|
||||||
|
}
|
||||||
|
void bzObjectPoolDestroy(BzObjectPool *pool) {
|
||||||
|
bzFree(pool);
|
||||||
|
}
|
||||||
|
|
||||||
|
void *bzObjectPool(BzObjectPool *pool) {
|
||||||
|
if (pool->firstFree == -1)
|
||||||
|
return NULL;
|
||||||
|
i32 *object = bzObjectPoolGetObject(pool, pool->firstFree);
|
||||||
|
pool->firstFree = *object;
|
||||||
|
return object;
|
||||||
|
}
|
||||||
|
void bzObjectPoolRelease(BzObjectPool *pool, void *object) {
|
||||||
|
size_t objectIdx = (size_t) object - (size_t)pool->objects;
|
||||||
|
BZ_ASSERT(objectIdx < pool->numObjects);
|
||||||
|
*(i32 *) objectIdx = pool->firstFree;
|
||||||
|
pool->firstFree = (i32) objectIdx;
|
||||||
|
}
|
||||||
19
engine/breeze/utils/object_pool.h
Normal file
19
engine/breeze/utils/object_pool.h
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
#ifndef BREEZE_OBJECT_POOL_H
|
||||||
|
#define BREEZE_OBJECT_POOL_H
|
||||||
|
|
||||||
|
#include "../defines.h"
|
||||||
|
|
||||||
|
typedef struct BzObjectPool BzObjectPool;
|
||||||
|
|
||||||
|
typedef struct BzObjectPoolDesc {
|
||||||
|
size_t objectSize;
|
||||||
|
size_t numObjects;
|
||||||
|
} BzObjectPoolDesc;
|
||||||
|
|
||||||
|
BzObjectPool *bzObjectPoolCreate(const BzObjectPoolDesc *desc);
|
||||||
|
void bzObjectPoolDestroy(BzObjectPool *pool);
|
||||||
|
|
||||||
|
void *bzObjectPool(BzObjectPool *pool);
|
||||||
|
void bzObjectPoolRelease(BzObjectPool *pool, void *object);
|
||||||
|
|
||||||
|
#endif //BREEZE_OBJECT_POOL_H
|
||||||
Reference in New Issue
Block a user