52 static bool PoolDataPreAllocated(
Pool *
p,
void *data)
54 ptrdiff_t delta = data -
p->data_buffer;
55 return delta >= 0 && delta <=
p->data_buffer_size;
58 static bool PoolInitData(
const Pool *
p,
void *data)
60 if (
p->Init != NULL) {
61 return p->Init(data) == 1;
63 memset(data, 0,
p->elt_size);
82 Pool *
PoolInit(
const uint32_t size,
const uint32_t prealloc_size,
const uint32_t elt_size,
83 void *(*Alloc)(
void),
int (*Init)(
void *),
void (*Cleanup)(
void *))
89 if (size != 0 && prealloc_size > size) {
93 if (size != 0 && elt_size == 0) {
97 if (elt_size == 0 && Alloc == NULL) {
109 p->max_buckets = size;
110 p->preallocated = prealloc_size;
111 p->elt_size = elt_size;
112 p->data_buffer_size = prealloc_size * elt_size;
115 p->Cleanup = Cleanup;
119 p->data_buffer =
SCCalloc(prealloc_size, elt_size);
120 if (
p->data_buffer == NULL) {
133 for (uint32_t i = 0; i < size; i++) {
135 b[i].
next =
p->empty_stack;
137 p->empty_stack = &b[i];
138 p->empty_stack_size++;
142 for (uint32_t i = 0; i < prealloc_size; i++) {
151 pb->
data =
p->Alloc();
155 if (pb->
data == NULL) {
160 if (PoolInitData(
p, pb->
data) ==
false) {
168 pb->
next =
p->alloc_stack;
170 p->alloc_stack_size++;
178 pb->
data = (
char *)
p->data_buffer + i * elt_size;
179 if (PoolInitData(
p, pb->
data) ==
false) {
185 p->empty_stack = pb->
next;
186 p->empty_stack_size--;
190 pb->
next =
p->alloc_stack;
192 p->alloc_stack_size++;
210 while (
p->alloc_stack != NULL) {
212 p->alloc_stack = pb->
next;
213 if (pb->
data != NULL) {
215 p->Cleanup(pb->
data);
216 if (
p->data_buffer == NULL || !PoolDataPreAllocated(
p, pb->
data)) {
227 while (
p->empty_stack != NULL) {
229 p->empty_stack = pb->
next;
230 if (pb->
data != NULL) {
232 p->Cleanup(pb->
data);
233 if (
p->data_buffer == NULL || !PoolDataPreAllocated(
p, pb->
data)) {
258 p->alloc_stack = pb->
next;
259 p->alloc_stack_size--;
262 pb->
next =
p->empty_stack;
264 p->empty_stack_size++;
266 if (
p->max_buckets == 0 ||
p->allocated <
p->max_buckets) {
268 SCLogDebug(
"max_buckets %"PRIu32
"",
p->max_buckets);
270 if (
p->Alloc != NULL) {
277 if (PoolInitData(
p, pitem) ==
false) {
285 if (
p->outstanding >
p->max_outstanding)
286 p->max_outstanding =
p->outstanding;
296 void *ptr = pb->
data;
300 if (
p->outstanding >
p->max_outstanding)
301 p->max_outstanding =
p->outstanding;
318 if (
p->Cleanup != NULL) {
321 if (
p->data_buffer == NULL || !PoolDataPreAllocated(
p, data)) {
327 SCLogDebug(
"tried to return data %p to the pool %p, but no more "
328 "buckets available. Just freeing the data.", data,
p);
333 p->empty_stack = pb->
next;
334 p->empty_stack_size--;
337 pb->
next =
p->alloc_stack;
339 p->alloc_stack_size++;
351 static void *PoolTestAlloc(
void)
359 static void PoolTestFree(
void *ptr)
363 static int PoolTestInit01 (
void)
365 Pool *
p =
PoolInit(10, 5, 10, PoolTestAlloc, NULL, PoolTestFree);
372 static int PoolTestInit02 (
void)
374 Pool *
p =
PoolInit(10, 5, 10, PoolTestAlloc, NULL, PoolTestFree);
389 static int PoolTestInit03 (
void)
391 Pool *
p =
PoolInit(10, 5, 10, PoolTestAlloc, NULL, PoolTestFree);
405 static int PoolTestInit04 (
void)
407 Pool *
p =
PoolInit(10, 5, strlen(
"test") + 1, NULL, NULL, PoolTestFree);
421 static int PoolTestInit05 (
void)
423 Pool *
p =
PoolInit(10, 5, 10, PoolTestAlloc, NULL, PoolTestFree);
444 static int PoolTestInit06 (
void)
446 Pool *
p =
PoolInit(1, 0, 10, PoolTestAlloc, NULL, PoolTestFree);
471 static int PoolTestInit07 (
void)
473 Pool *
p =
PoolInit(0, 1, 10, PoolTestAlloc, NULL, PoolTestFree);