Mercurial > dovecot > original-hg > dovecot-1.2
changeset 3234:06f9da4ff7a5 HEAD
Added pool_get_exp_grown_size(). Use it for buffers, istreams and ostreams
when buffer needs to grow. Optimizes memory usage a bit.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sun, 27 Mar 2005 16:51:54 +0300 |
parents | 6396b4c0a721 |
children | d20aee22af6a |
files | src/lib/Makefile.am src/lib/buffer.c src/lib/istream-file.c src/lib/mempool.c src/lib/mempool.h src/lib/ostream-file.c |
diffstat | 6 files changed, 33 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib/Makefile.am Sun Mar 27 16:29:30 2005 +0300 +++ b/src/lib/Makefile.am Sun Mar 27 16:51:54 2005 +0300 @@ -35,6 +35,7 @@ lib-signals.c \ md4.c \ md5.c \ + mempool.c \ mempool-alloconly.c \ mempool-datastack.c \ mempool-system.c \
--- a/src/lib/buffer.c Sun Mar 27 16:29:30 2005 +0300 +++ b/src/lib/buffer.c Sun Mar 27 16:51:54 2005 +0300 @@ -54,7 +54,8 @@ buf->pool->get_name(buf->pool)); } - buffer_alloc(buf, nearest_power(new_size)); + buffer_alloc(buf, pool_get_exp_grown_size(buf->pool, buf->alloc, + new_size)); } if (new_size > buf->used)
--- a/src/lib/istream-file.c Sun Mar 27 16:29:30 2005 +0300 +++ b/src/lib/istream-file.c Sun Mar 27 16:51:54 2005 +0300 @@ -58,8 +58,11 @@ stream->buffer_size = stream->pos + bytes; if (stream->buffer_size <= I_STREAM_MIN_SIZE) stream->buffer_size = I_STREAM_MIN_SIZE; - else - stream->buffer_size = nearest_power(stream->buffer_size); + else { + stream->buffer_size = + pool_get_exp_grown_size(stream->iostream.pool, + old_size, stream->buffer_size); + } if (fstream->max_buffer_size > 0 && stream->buffer_size > fstream->max_buffer_size)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/lib/mempool.c Sun Mar 27 16:51:54 2005 +0300 @@ -0,0 +1,17 @@ +/* Copyright (c) 2005 Timo Sirainen */ + +#include "lib.h" + +size_t pool_get_exp_grown_size(pool_t pool, size_t old_size, size_t min_size) +{ + size_t exp_size, easy_size; + + i_assert(old_size < min_size); + + exp_size = nearest_power(min_size); + easy_size = old_size + p_get_max_easy_alloc_size(pool); + + if (easy_size < exp_size && easy_size >= min_size) + exp_size = easy_size; + return exp_size; +}
--- a/src/lib/mempool.h Sun Mar 27 16:29:30 2005 +0300 +++ b/src/lib/mempool.h Sun Mar 27 16:51:54 2005 +0300 @@ -50,6 +50,11 @@ that the stack frame is the same. This should make it quite safe to use. */ pool_t pool_datastack_create(void); +/* Similar to nearest_power(), but try not to exceed buffer's easy + allocation size. If you don't have any explicit minimum size, use + old_size + 1. */ +size_t pool_get_exp_grown_size(pool_t pool, size_t old_size, size_t min_size); + /* Pools should be used through these macros: */ #define pool_get_name(pool) (pool)->get_name(pool) #define pool_ref(pool) (pool)->ref(pool)
--- a/src/lib/ostream-file.c Sun Mar 27 16:29:30 2005 +0300 +++ b/src/lib/ostream-file.c Sun Mar 27 16:51:54 2005 +0300 @@ -298,7 +298,9 @@ { size_t size, new_size, end_size; - size = nearest_power(fstream->buffer_size + bytes); + size = pool_get_exp_grown_size(fstream->ostream.iostream.pool, + fstream->buffer_size, + fstream->buffer_size + bytes); if (size > fstream->max_buffer_size) { /* limit the size */ size = fstream->max_buffer_size;