From de1639e263757cbecafc98873cf9f23b5085cf2a Mon Sep 17 00:00:00 2001 From: Victor Julien Date: Tue, 21 Jul 2009 13:15:17 +0200 Subject: [PATCH] Enforce max pool size. --- src/util-pool.c | 27 +++++++++++++++++---------- src/util-pool.h | 3 +++ 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/util-pool.c b/src/util-pool.c index ee2227bcb0..e5c939878d 100644 --- a/src/util-pool.c +++ b/src/util-pool.c @@ -28,6 +28,7 @@ Pool *PoolInit(u_int32_t size, u_int32_t prealloc_size, void *(*Alloc)(void *), memset(p,0,sizeof(Pool)); + p->max_buckets = size; p->Alloc = Alloc; p->AllocData = AllocData; p->Free = Free; @@ -56,6 +57,7 @@ Pool *PoolInit(u_int32_t size, u_int32_t prealloc_size, void *(*Alloc)(void *), p->empty_list_size--; pb->data = p->Alloc(p->AllocData); + p->allocated++; pb->next = p->alloc_list; p->alloc_list = pb; @@ -97,17 +99,22 @@ void PoolPrint(Pool *p) { void *PoolGet(Pool *p) { PoolBucket *pb = p->alloc_list; - if (pb == NULL) - return NULL; - - /* pull from the alloc list */ - p->alloc_list = pb->next; - p->alloc_list_size--; + if (pb != NULL) { + /* pull from the alloc list */ + p->alloc_list = pb->next; + p->alloc_list_size--; - /* put in the empty list */ - pb->next = p->empty_list; - p->empty_list = pb; - p->empty_list_size++; + /* put in the empty list */ + pb->next = p->empty_list; + p->empty_list = pb; + p->empty_list_size++; + } else { + if (p->allocated < p->max_buckets) { + return p->Alloc(p->AllocData); + } else { + return NULL; + } + } void *ptr = pb->data; pb->data = NULL; diff --git a/src/util-pool.h b/src/util-pool.h index 748b40081b..3dac1d399e 100644 --- a/src/util-pool.h +++ b/src/util-pool.h @@ -11,6 +11,9 @@ typedef struct _PoolBucket { /* pool structure */ typedef struct _Pool { + u_int32_t max_buckets; + u_int32_t allocated; + PoolBucket *alloc_list; u_int32_t alloc_list_size;