dovecot-2.2: istream-seekable: When we reach EOF, unreference al...

dovecot at dovecot.org dovecot at dovecot.org
Sat Aug 11 05:17:25 EEST 2012


details:   http://hg.dovecot.org/dovecot-2.2/rev/2a973e6c25f8
changeset: 14855:2a973e6c25f8
user:      Timo Sirainen <tss at iki.fi>
date:      Sat Aug 11 05:17:19 2012 +0300
description:
istream-seekable: When we reach EOF, unreference all the input streams.

diffstat:

 src/lib/istream-seekable.c |  20 +++++++++++---------
 1 files changed, 11 insertions(+), 9 deletions(-)

diffs (66 lines):

diff -r 928b099a63cb -r 2a973e6c25f8 src/lib/istream-seekable.c
--- a/src/lib/istream-seekable.c	Sat Aug 11 05:15:00 2012 +0300
+++ b/src/lib/istream-seekable.c	Sat Aug 11 05:17:19 2012 +0300
@@ -41,17 +41,23 @@
 		i_stream_close(sstream->input[i]);
 }
 
+static void unref_streams(struct seekable_istream *sstream)
+{
+	unsigned int i;
+
+	for (i = 0; sstream->input[i] != NULL; i++)
+		i_stream_unref(&sstream->input[i]);
+}
+
 static void i_stream_seekable_destroy(struct iostream_private *stream)
 {
 	struct seekable_istream *sstream = (struct seekable_istream *)stream;
-	unsigned int i;
 
 	if (sstream->membuf != NULL)
 		buffer_free(&sstream->membuf);
 	if (sstream->fd_input != NULL)
 		i_stream_unref(&sstream->fd_input);
-	for (i = 0; sstream->input[i] != NULL; i++)
-		i_stream_unref(&sstream->input[i]);
+	unref_streams(sstream);
 
 	i_free(sstream->temp_path);
 	i_free(sstream->input);
@@ -159,8 +165,6 @@
 	const unsigned char *data;
 	size_t size, pos, offset;
 
-	i_assert(stream->skip == 0);
-
 	if (stream->istream.v_offset + stream->pos >= sstream->membuf->used) {
 		/* need to read more */
 		if (sstream->membuf->used >= stream->max_buffer_size)
@@ -189,6 +193,7 @@
 	*ret_r = pos - stream->pos;
 	i_assert(*ret_r > 0);
 	stream->pos = pos;
+	stream->skip = 0;
 	return TRUE;
 }
 
@@ -223,10 +228,6 @@
 	size_t size, pos;
 	ssize_t ret;
 
-	stream->buffer = CONST_PTR_OFFSET(stream->buffer, stream->skip);
-	stream->pos -= stream->skip;
-	stream->skip = 0;
-
 	if (sstream->membuf != NULL) {
 		if (read_from_buffer(sstream, &ret))
 			return ret;
@@ -316,6 +317,7 @@
 		}
 		i_stream_skip(&stream->istream, stream->pos - stream->skip);
 		i_stream_seek(&stream->istream, old_offset);
+		unref_streams(sstream);
 	}
 
 	if (sstream->fd_input != NULL) {


More information about the dovecot-cvs mailing list