188a360acSJiří Techet /*
288a360acSJiří Techet * Copyright (c) 2016, Jiri Techet
388a360acSJiří Techet *
488a360acSJiří Techet * This source code is released for free distribution under the terms of the
588a360acSJiří Techet * GNU General Public License version 2 or (at your option) any later version.
688a360acSJiří Techet *
788a360acSJiří Techet * Defines generic pool for object reuse reducing the amount of allocations
888a360acSJiří Techet * and deallocations.
988a360acSJiří Techet */
1088a360acSJiří Techet
1188a360acSJiří Techet /*
1288a360acSJiří Techet * INCLUDE FILES
1388a360acSJiří Techet */
1488a360acSJiří Techet #include "general.h" /* must always come first */
1588a360acSJiří Techet
16*aa629efcSMasatake YAMATO #include "debug.h"
1788a360acSJiří Techet #include "routines.h"
1888a360acSJiří Techet #include "objpool.h"
1988a360acSJiří Techet
2088a360acSJiří Techet /*
2188a360acSJiří Techet * DATA DECLARATIONS
2288a360acSJiří Techet */
2388a360acSJiří Techet
2488a360acSJiří Techet struct sObjPool {
2588a360acSJiří Techet ptrArray *array;
2688a360acSJiří Techet unsigned int size;
2788a360acSJiří Techet objPoolCreateFunc createFunc;
2888a360acSJiří Techet objPoolDeleteFunc deleteFunc;
2988a360acSJiří Techet objPoolClearFunc clearFunc;
30e013efc1SMasatake YAMATO void *createArg;
3188a360acSJiří Techet };
3288a360acSJiří Techet
3388a360acSJiří Techet /*
3488a360acSJiří Techet * FUNCTION DEFINITIONS
3588a360acSJiří Techet */
objPoolNew(unsigned int size,objPoolCreateFunc createFunc,objPoolDeleteFunc deleteFunc,objPoolClearFunc clearFunc,void * createArg)3688a360acSJiří Techet extern objPool *objPoolNew (unsigned int size,
37e013efc1SMasatake YAMATO objPoolCreateFunc createFunc, objPoolDeleteFunc deleteFunc, objPoolClearFunc clearFunc,
38e013efc1SMasatake YAMATO void *createArg)
3988a360acSJiří Techet {
4088a360acSJiří Techet objPool* const result = xMalloc (1, objPool);
4188a360acSJiří Techet result->array = ptrArrayNew (deleteFunc);
4288a360acSJiří Techet result->size = size;
4388a360acSJiří Techet result->createFunc = createFunc;
4488a360acSJiří Techet result->deleteFunc = deleteFunc;
4588a360acSJiří Techet result->clearFunc = clearFunc;
46e013efc1SMasatake YAMATO result->createArg = createArg;
4788a360acSJiří Techet return result;
4888a360acSJiří Techet }
4988a360acSJiří Techet
objPoolDelete(objPool * pool)5088a360acSJiří Techet extern void objPoolDelete (objPool *pool)
5188a360acSJiří Techet {
5288a360acSJiří Techet ptrArrayDelete (pool->array);
5388a360acSJiří Techet eFree (pool);
5488a360acSJiří Techet }
5588a360acSJiří Techet
objPoolGet(objPool * pool)5688a360acSJiří Techet extern void *objPoolGet (objPool *pool)
5788a360acSJiří Techet {
5888a360acSJiří Techet void *obj;
5988a360acSJiří Techet
6088a360acSJiří Techet if (ptrArrayCount (pool->array) > 0)
6188a360acSJiří Techet {
6288a360acSJiří Techet obj = ptrArrayLast (pool->array);
6388a360acSJiří Techet ptrArrayRemoveLast (pool->array);
6488a360acSJiří Techet }
6588a360acSJiří Techet else
66e013efc1SMasatake YAMATO obj = pool->createFunc (pool->createArg);
6788a360acSJiří Techet
6888a360acSJiří Techet if (pool->clearFunc)
6988a360acSJiří Techet pool->clearFunc (obj);
7088a360acSJiří Techet
7188a360acSJiří Techet return obj;
7288a360acSJiří Techet }
7388a360acSJiří Techet
objPoolPut(objPool * pool,void * obj)7488a360acSJiří Techet extern void objPoolPut (objPool *pool, void *obj)
7588a360acSJiří Techet {
7688a360acSJiří Techet if (obj == NULL)
7788a360acSJiří Techet return;
7888a360acSJiří Techet
79*aa629efcSMasatake YAMATO if (
80*aa629efcSMasatake YAMATO #ifdef DISABLE_OBJPOOL
81*aa629efcSMasatake YAMATO 0 &&
82*aa629efcSMasatake YAMATO #endif
83*aa629efcSMasatake YAMATO ptrArrayCount (pool->array) < pool->size
84*aa629efcSMasatake YAMATO )
8588a360acSJiří Techet ptrArrayAdd (pool->array, obj);
8688a360acSJiří Techet else
8788a360acSJiří Techet pool->deleteFunc (obj);
8888a360acSJiří Techet }
89