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;