pool now uses a queue kinda behaviour when getting/inserting data through poolbuckets.

pull/400/head
Anoop Saldanha 12 years ago committed by Victor Julien
parent f4c719b83a
commit d2063d98ad

@ -168,6 +168,9 @@ Pool *PoolInit(uint32_t size, uint32_t prealloc_size, uint32_t elt_size, void *
pb->next = p->alloc_list; pb->next = p->alloc_list;
p->alloc_list = pb; p->alloc_list = pb;
if (p->alloc_list_tail == NULL) {
p->alloc_list_tail = pb;
}
p->alloc_list_size++; p->alloc_list_size++;
} else { } else {
PoolBucket *pb = p->empty_list; PoolBucket *pb = p->empty_list;
@ -188,6 +191,9 @@ Pool *PoolInit(uint32_t size, uint32_t prealloc_size, uint32_t elt_size, void *
pb->next = p->alloc_list; pb->next = p->alloc_list;
p->alloc_list = pb; p->alloc_list = pb;
if (p->alloc_list_tail == NULL) {
p->alloc_list_tail = pb;
}
p->alloc_list_size++; p->alloc_list_size++;
} }
} }
@ -222,6 +228,7 @@ void PoolFree(Pool *p) {
SCFree(pb); SCFree(pb);
} }
} }
p->alloc_list_tail = NULL;
while (p->empty_list != NULL) { while (p->empty_list != NULL) {
PoolBucket *pb = p->empty_list; PoolBucket *pb = p->empty_list;
@ -262,6 +269,8 @@ void *PoolGet(Pool *p) {
if (pb != NULL) { if (pb != NULL) {
/* pull from the alloc list */ /* pull from the alloc list */
p->alloc_list = pb->next; p->alloc_list = pb->next;
if (pb->next == NULL)
p->alloc_list_tail = NULL;
p->alloc_list_size--; p->alloc_list_size--;
/* put in the empty list */ /* put in the empty list */
@ -331,8 +340,13 @@ void PoolReturn(Pool *p, void *data) {
p->empty_list_size--; p->empty_list_size--;
/* put in the alloc list */ /* put in the alloc list */
pb->next = p->alloc_list; pb->next = NULL;
p->alloc_list = pb; if (p->alloc_list_tail == NULL) {
p->alloc_list = pb;
} else {
p->alloc_list_tail->next = pb;
}
p->alloc_list_tail = pb;
p->alloc_list_size++; p->alloc_list_size++;
pb->data = data; pb->data = data;

@ -46,6 +46,7 @@ typedef struct Pool_ {
uint32_t allocated; uint32_t allocated;
PoolBucket *alloc_list; PoolBucket *alloc_list;
PoolBucket *alloc_list_tail;
uint32_t alloc_list_size; uint32_t alloc_list_size;
PoolBucket *empty_list; PoolBucket *empty_list;

Loading…
Cancel
Save