/* alloc the buckets and place them in the empty list */
uint32_t u32 = 0;
- for (u32 = 0; u32 < size; u32++) {
- /* populate pool */
- PoolBucket *pb = SCMalloc(sizeof(PoolBucket));
+ if (size > 0) {
+ PoolBucket *pb = SCCalloc(size, sizeof(PoolBucket));
+ p->pb_buffer = pb;
if (pb == NULL)
goto error;
-
- memset(pb, 0, sizeof(PoolBucket));
- pb->next = p->empty_list;
- p->empty_list = pb;
- p->empty_list_size++;
+ memset(pb, 0, size * sizeof(PoolBucket));
+ for (u32 = 0; u32 < size; u32++) {
+ /* populate pool */
+ pb->next = p->empty_list;
+ pb->flags |= POOL_BUCKET_PREALLOCATED;
+ p->empty_list = pb;
+ p->empty_list_size++;
+ pb++;
+ }
}
/* prealloc the buckets and requeue them to the alloc list */
p->alloc_list = pb->next;
p->Free(pb->data);
pb->data = NULL;
- SCFree(pb);
+ if (! pb->flags & POOL_BUCKET_PREALLOCATED) {
+ SCFree(pb);
+ }
}
while (p->empty_list != NULL) {
PoolBucket *pb = p->empty_list;
p->empty_list = pb->next;
- if (pb->data!= NULL) {
+ if (pb->data!= NULL) {
p->Free(pb->data);
pb->data = NULL;
}
- SCFree(pb);
+ if (! pb->flags & POOL_BUCKET_PREALLOCATED) {
+ SCFree(pb);
+ }
}
+ if (p->pb_buffer)
+ SCFree(p->pb_buffer);
SCFree(p);
}
#ifndef __UTIL_POOL_H__
#define __UTIL_POOL_H__
+#define POOL_BUCKET_PREALLOCATED (1 << 0)
+
/* pool bucket structure */
typedef struct PoolBucket_ {
void *data;
+ uint8_t flags;
struct PoolBucket_ *next;
} PoolBucket;
PoolBucket *empty_list;
uint32_t empty_list_size;
+ PoolBucket *pb_buffer;
+ void *data_buffer;
+
void *(*Alloc)(void *);
void *AllocData;
void (*Free)(void *);