xref: /Universal-ctags/main/objpool.c (revision aa629efca32cc4e8930ec9727c8338dc5040f6a0)
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