51 static bool PoolDataPreAllocated(
Pool *
p,
void *data)
53 ptrdiff_t delta = data -
p->data_buffer;
54 return delta >= 0 && delta <=
p->data_buffer_size;
57 static bool PoolInitData(
const Pool *
p,
void *data)
59 if (
p->Init != NULL) {
60 return p->Init(data) == 1;
62 memset(data, 0,
p->elt_size);
81 Pool *
PoolInit(
const uint32_t size,
const uint32_t prealloc_size,
const uint32_t elt_size,
82 void *(*Alloc)(
void),
int (*Init)(
void *),
void (*Cleanup)(
void *))
88 if (size != 0 && prealloc_size > size) {
92 if (size != 0 && elt_size == 0) {
96 if (elt_size == 0 && Alloc == NULL) {
108 p->max_buckets = size;
109 p->preallocated = prealloc_size;
110 p->elt_size = elt_size;
111 p->data_buffer_size = prealloc_size * elt_size;
114 p->Cleanup = Cleanup;
118 p->data_buffer =
SCCalloc(prealloc_size, elt_size);
119 if (
p->data_buffer == NULL) {
132 for (uint32_t i = 0; i < size; i++) {
134 b[i].
next =
p->empty_stack;
136 p->empty_stack = &b[i];
137 p->empty_stack_size++;
141 for (uint32_t i = 0; i < prealloc_size; i++) {
150 pb->
data =
p->Alloc();
154 if (pb->
data == NULL) {
159 if (PoolInitData(
p, pb->
data) ==
false) {
167 pb->
next =
p->alloc_stack;
169 p->alloc_stack_size++;
177 pb->
data = (
char *)
p->data_buffer + i * elt_size;
178 if (PoolInitData(
p, pb->
data) ==
false) {
184 p->empty_stack = pb->
next;
185 p->empty_stack_size--;
189 pb->
next =
p->alloc_stack;
191 p->alloc_stack_size++;
209 while (
p->alloc_stack != NULL) {
211 p->alloc_stack = pb->
next;
212 if (pb->
data != NULL) {
214 p->Cleanup(pb->
data);
215 if (
p->data_buffer == NULL || !PoolDataPreAllocated(
p, pb->
data)) {
226 while (
p->empty_stack != NULL) {
228 p->empty_stack = pb->
next;
229 if (pb->
data != NULL) {
231 p->Cleanup(pb->
data);
232 if (
p->data_buffer == NULL || !PoolDataPreAllocated(
p, pb->
data)) {
257 p->alloc_stack = pb->
next;
258 p->alloc_stack_size--;
261 pb->
next =
p->empty_stack;
263 p->empty_stack_size++;
265 if (
p->max_buckets == 0 ||
p->allocated <
p->max_buckets) {
267 SCLogDebug(
"max_buckets %"PRIu32
"",
p->max_buckets);
269 if (
p->Alloc != NULL) {
276 if (PoolInitData(
p, pitem) ==
false) {
284 if (
p->outstanding >
p->max_outstanding)
285 p->max_outstanding =
p->outstanding;
295 void *ptr = pb->
data;
299 if (
p->outstanding >
p->max_outstanding)
300 p->max_outstanding =
p->outstanding;
317 if (
p->Cleanup != NULL) {
320 if (
p->data_buffer == NULL || !PoolDataPreAllocated(
p, data)) {
326 SCLogDebug(
"tried to return data %p to the pool %p, but no more "
327 "buckets available. Just freeing the data.", data,
p);
332 p->empty_stack = pb->
next;
333 p->empty_stack_size--;
336 pb->
next =
p->alloc_stack;
338 p->alloc_stack_size++;
350 static void *PoolTestAlloc(
void)
358 static void PoolTestFree(
void *ptr)
362 static int PoolTestInit01 (
void)
364 Pool *
p =
PoolInit(10, 5, 10, PoolTestAlloc, NULL, PoolTestFree);
371 static int PoolTestInit02 (
void)
373 Pool *
p =
PoolInit(10, 5, 10, PoolTestAlloc, NULL, PoolTestFree);
388 static int PoolTestInit03 (
void)
390 Pool *
p =
PoolInit(10, 5, 10, PoolTestAlloc, NULL, PoolTestFree);
404 static int PoolTestInit04 (
void)
406 Pool *
p =
PoolInit(10, 5, strlen(
"test") + 1, NULL, NULL, PoolTestFree);
420 static int PoolTestInit05 (
void)
422 Pool *
p =
PoolInit(10, 5, 10, PoolTestAlloc, NULL, PoolTestFree);
443 static int PoolTestInit06 (
void)
445 Pool *
p =
PoolInit(1, 0, 10, PoolTestAlloc, NULL, PoolTestFree);
470 static int PoolTestInit07 (
void)
472 Pool *
p =
PoolInit(0, 1, 10, PoolTestAlloc, NULL, PoolTestFree);