diff --git a/src/util-pool.c b/src/util-pool.c index 7a3d775e4c..a8a372bba2 100644 --- a/src/util-pool.c +++ b/src/util-pool.c @@ -168,6 +168,9 @@ Pool *PoolInit(uint32_t size, uint32_t prealloc_size, uint32_t elt_size, void * pb->next = p->alloc_list; p->alloc_list = pb; + if (p->alloc_list_tail == NULL) { + p->alloc_list_tail = pb; + } p->alloc_list_size++; } else { 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; p->alloc_list = pb; + if (p->alloc_list_tail == NULL) { + p->alloc_list_tail = pb; + } p->alloc_list_size++; } } @@ -222,6 +228,7 @@ void PoolFree(Pool *p) { SCFree(pb); } } + p->alloc_list_tail = NULL; while (p->empty_list != NULL) { PoolBucket *pb = p->empty_list; @@ -262,6 +269,8 @@ void *PoolGet(Pool *p) { if (pb != NULL) { /* pull from the alloc list */ p->alloc_list = pb->next; + if (pb->next == NULL) + p->alloc_list_tail = NULL; p->alloc_list_size--; /* put in the empty list */ @@ -331,8 +340,13 @@ void PoolReturn(Pool *p, void *data) { p->empty_list_size--; /* put in the alloc list */ - pb->next = p->alloc_list; - p->alloc_list = pb; + pb->next = NULL; + 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++; pb->data = data; diff --git a/src/util-pool.h b/src/util-pool.h index c92d23cfa4..72dc85883d 100644 --- a/src/util-pool.h +++ b/src/util-pool.h @@ -46,6 +46,7 @@ typedef struct Pool_ { uint32_t allocated; PoolBucket *alloc_list; + PoolBucket *alloc_list_tail; uint32_t alloc_list_size; PoolBucket *empty_list;