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