pool: alloc a single area for all PoolBuckets

As we know the number and the size of PoolBucket, we can simply
allocate a single memory zone.
pull/49/merge
Eric Leblond 13 years ago committed by Victor Julien
parent b58ecd833a
commit cd76c7e5fb

@ -54,16 +54,20 @@ Pool *PoolInit(uint32_t size, uint32_t prealloc_size, void *(*Alloc)(void *), vo
/* 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 */
@ -116,19 +120,25 @@ void PoolFree(Pool *p) {
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);
}

@ -24,9 +24,12 @@
#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;
@ -41,6 +44,9 @@ typedef struct Pool_ {
PoolBucket *empty_list;
uint32_t empty_list_size;
PoolBucket *pb_buffer;
void *data_buffer;
void *(*Alloc)(void *);
void *AllocData;
void (*Free)(void *);

Loading…
Cancel
Save