diff options
author | Nick Mathewson <nickm@torproject.org> | 2007-04-11 13:18:25 +0000 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2007-04-11 13:18:25 +0000 |
commit | 38a5f0950250ad21e48ad60c1036621c58ecd9d4 (patch) | |
tree | a792258f5224faff370d13bc0fd541211da439fb /src/common | |
parent | 1c8f9b319b6cd94c1c00731349c9dda6ec723979 (diff) | |
download | tor-38a5f0950250ad21e48ad60c1036621c58ecd9d4.tar.gz tor-38a5f0950250ad21e48ad60c1036621c58ecd9d4.zip |
r12349@catbus: nickm | 2007-04-11 09:18:15 -0400
Add code to shrink the cell memory pool by discarding empty chunks that have been empty for the last 60 seconds. Also, instead of having test.c duplicate declarations for exposed functions, put them inside #ifdef foo_PRIVATE blocks in the headers. This prevents bugs where test.c gets out of sync.
svn:r9944
Diffstat (limited to 'src/common')
-rw-r--r-- | src/common/mempool.c | 13 | ||||
-rw-r--r-- | src/common/mempool.h | 3 |
2 files changed, 15 insertions, 1 deletions
diff --git a/src/common/mempool.c b/src/common/mempool.c index 06f23ad94f..ca196530db 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 1f9e2f5534..09174b2a55 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 |