From a8b7c46c2548ea836d04b3b5bff62444469707b0 Mon Sep 17 00:00:00 2001 From: Peter Reijnders Date: Fri, 24 Apr 2015 15:42:49 +0200 Subject: [PATCH 1/2] Better validation and faster handling of pools. During the setup of unittest, this routine caused much confusion by me and valgrind. This version is a little bit simpler, better to understand and appox. 12 % faster. --- ape_pool.c | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/ape_pool.c b/ape_pool.c index 1d5e770..d2c4520 100644 --- a/ape_pool.c +++ b/ape_pool.c @@ -21,27 +21,36 @@ #include #include -ape_pool_t *ape_new_pool(size_t size, size_t n) +ape_pool_t *ape_new_pool(size_t size, const size_t n) { - unsigned int i; - - if (size == 0) { + size_t i; + const size_t stop = n - 1; + ape_pool_t * pool, *current; + + if (size == 0) { size = sizeof(ape_pool_t); + } else if ( n == 0 ) { + return NULL; + } else if (size < sizeof(ape_pool_t) ) { + return NULL; } - - ape_pool_t *pool = malloc(size * n), *current = NULL; + + current = pool = malloc(size * n); pool->prev = NULL; - - for (i = 0; i < n; i++) { - current = (ape_pool_t*)(((char *)&pool[0])+(i*size)); - /* contiguous blocks */ - current->next = (i == n-1 ? NULL : (ape_pool_t*)(((char *)&pool[0])+((i+1)*size))); + i = 0; + while(current != NULL) { current->ptr.data = NULL; - current->flags = (i == 0 ? APE_POOL_ALLOC : 0); - if (current->next) { + current->flags = 0; + if (i == stop) { + current = current->next = NULL; + } else { + i++; + current->next = (ape_pool_t*) (( (char *)&pool[0]) + (i * size)); current->next->prev = current; + current = current->next; } } + pool->flags = APE_POOL_ALLOC; return pool; } From 5d0586169ffae3548f41b2197d156c086cb7b87f Mon Sep 17 00:00:00 2001 From: Peter Reijnders Date: Thu, 30 Apr 2015 08:04:12 +0200 Subject: [PATCH 2/2] Added another validity check for ape_new_pool's parameters. --- ape_pool.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ape_pool.c b/ape_pool.c index d2c4520..b84c326 100644 --- a/ape_pool.c +++ b/ape_pool.c @@ -27,14 +27,16 @@ ape_pool_t *ape_new_pool(size_t size, const size_t n) const size_t stop = n - 1; ape_pool_t * pool, *current; - if (size == 0) { + if (size == 0) { size = sizeof(ape_pool_t); } else if ( n == 0 ) { return NULL; } else if (size < sizeof(ape_pool_t) ) { return NULL; } - + if (n == 0) { + return NULL; + } current = pool = malloc(size * n); pool->prev = NULL; i = 0;