xref: /Universal-ctags/main/objpool.c (revision aa629efca32cc4e8930ec9727c8338dc5040f6a0)
1 /*
2 *   Copyright (c) 2016, Jiri Techet
3 *
4 *   This source code is released for free distribution under the terms of the
5 *   GNU General Public License version 2 or (at your option) any later version.
6 *
7 *   Defines generic pool for object reuse reducing the amount of allocations
8 *   and deallocations.
9 */
10 
11 /*
12 *   INCLUDE FILES
13 */
14 #include "general.h"  /* must always come first */
15 
16 #include "debug.h"
17 #include "routines.h"
18 #include "objpool.h"
19 
20 /*
21 *   DATA DECLARATIONS
22 */
23 
24 struct sObjPool {
25 	ptrArray *array;
26 	unsigned int size;
27 	objPoolCreateFunc createFunc;
28 	objPoolDeleteFunc deleteFunc;
29 	objPoolClearFunc clearFunc;
30 	void *createArg;
31 };
32 
33 /*
34 *   FUNCTION DEFINITIONS
35 */
objPoolNew(unsigned int size,objPoolCreateFunc createFunc,objPoolDeleteFunc deleteFunc,objPoolClearFunc clearFunc,void * createArg)36 extern objPool *objPoolNew (unsigned int size,
37 	objPoolCreateFunc createFunc, objPoolDeleteFunc deleteFunc, objPoolClearFunc clearFunc,
38 	void *createArg)
39 {
40 	objPool* const result = xMalloc (1, objPool);
41 	result->array = ptrArrayNew (deleteFunc);
42 	result->size = size;
43 	result->createFunc = createFunc;
44 	result->deleteFunc = deleteFunc;
45 	result->clearFunc = clearFunc;
46 	result->createArg = createArg;
47 	return result;
48 }
49 
objPoolDelete(objPool * pool)50 extern void objPoolDelete (objPool *pool)
51 {
52 	ptrArrayDelete (pool->array);
53 	eFree (pool);
54 }
55 
objPoolGet(objPool * pool)56 extern void *objPoolGet (objPool *pool)
57 {
58 	void *obj;
59 
60 	if (ptrArrayCount (pool->array) > 0)
61 	{
62 		obj = ptrArrayLast (pool->array);
63 		ptrArrayRemoveLast (pool->array);
64 	}
65 	else
66 		obj = pool->createFunc (pool->createArg);
67 
68 	if (pool->clearFunc)
69 		pool->clearFunc (obj);
70 
71 	return obj;
72 }
73 
objPoolPut(objPool * pool,void * obj)74 extern void objPoolPut (objPool *pool, void *obj)
75 {
76 	if (obj == NULL)
77 		return;
78 
79 	if (
80 #ifdef DISABLE_OBJPOOL
81 		0 &&
82 #endif
83 		ptrArrayCount (pool->array) < pool->size
84 		)
85 		ptrArrayAdd (pool->array, obj);
86 	else
87 		pool->deleteFunc (obj);
88 }
89