aboutsummaryrefslogtreecommitdiff
path: root/src/common
diff options
context:
space:
mode:
Diffstat (limited to 'src/common')
-rw-r--r--src/common/mempool.c13
-rw-r--r--src/common/mempool.h3
2 files changed, 15 insertions, 1 deletions
diff --git a/src/common/mempool.c b/src/common/mempool.c
index 06f23ad94..ca196530d 100644
--- a/src/common/mempool.c
+++ b/src/common/mempool.c
@@ -210,6 +210,8 @@ mp_pool_get(mp_pool_t *pool)
ASSERT(!chunk->prev);
--pool->n_empty_chunks;
+ if (pool->n_empty_chunks < pool->min_empty_chunks)
+ pool->min_empty_chunks = pool->n_empty_chunks;
} else {
/* We have no used or empty chunks: allocate a new chunk. */
chunk = mp_chunk_new(pool);
@@ -375,11 +377,20 @@ mp_pool_new(size_t item_size, size_t chunk_capacity)
}
/** If there are more than <b>n</b> empty chunks in <b>pool</b>, free the
- * exces ones that have been empty for the longest. */
+ * exces ones that have been empty for the longest. (If <b>n</b> is less
+ * than zero, free only empty chunks that were not used since the last
+ * call to mp_pool_clean(), leaving only -<b>n</b>.) */
void
mp_pool_clean(mp_pool_t *pool, int n)
{
mp_chunk_t *chunk, **first_to_free;
+ if (n < 0) {
+ n = pool->min_empty_chunks + (-n);
+ if (n < pool->n_empty_chunks)
+ pool->min_empty_chunks = n;
+ }
+ ASSERT(n>=0);
+
first_to_free = &pool->empty_chunks;
while (*first_to_free && n > 0) {
first_to_free = &(*first_to_free)->next;
diff --git a/src/common/mempool.h b/src/common/mempool.h
index 1f9e2f553..09174b2a5 100644
--- a/src/common/mempool.h
+++ b/src/common/mempool.h
@@ -38,6 +38,9 @@ struct mp_pool_t {
struct mp_chunk_t *full_chunks;
/** Length of <b>empty_chunks</b>. */
int n_empty_chunks;
+ /** Lowest value of <b>empty_chunks</b> since last call to
+ * mp_pool_clean(-1). */
+ int min_empty_chunks;
/** Size of each chunk (in items). */
int new_chunk_capacity;
/** Size to allocate for each item, including overhead and alignment