changeset 5990:14a0630a4fa9 HEAD

When all child streams are destroyed, make sure the main stream's offset is the same as the maximum child offset.
author Timo Sirainen <tss@iki.fi>
date Sat, 14 Jul 2007 22:12:30 +0300
parents 1a7f5c04af1d
children 5dacddf4a88a
files src/lib/istream-tee.c
diffstat 1 files changed, 21 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib/istream-tee.c	Sat Jul 14 22:10:26 2007 +0300
+++ b/src/lib/istream-tee.c	Sat Jul 14 22:12:30 2007 +0300
@@ -8,6 +8,8 @@
 	pool_t pool;
 	struct istream *input;
 	struct tee_child_istream *children;
+
+	uoff_t max_read_offset;
 };
 
 struct tee_child_istream {
@@ -25,6 +27,10 @@
 
 	data = i_stream_get_data(tee->input, &size);
 	for (; tstream != NULL; tstream = tstream->next) {
+		if (tstream->istream.istream.closed) {
+			tstream->istream.skip = tstream->istream.pos = 0;
+			continue;
+		}
 		old_used = tstream->istream.pos - tstream->istream.skip;
 
 		tstream->istream.buffer = data;
@@ -42,11 +48,12 @@
 
 	min_skip = (size_t)-1;
 	for (; tstream != NULL; tstream = tstream->next) {
-		if (tstream->istream.skip < min_skip)
+		if (tstream->istream.skip < min_skip &&
+		    !tstream->istream.istream.closed)
 			min_skip = tstream->istream.skip;
 	}
 
-	if (min_skip > 0) {
+	if (min_skip > 0 && min_skip != (size_t)-1) {
 		i_stream_skip(tee->input, min_skip);
 		tee_streams_update_buffer(tee);
 	}
@@ -65,6 +72,9 @@
 	struct tee_istream *tee = tstream->tee;
 	struct tee_child_istream **p;
 
+	if (tstream->istream.istream.v_offset > tee->max_read_offset)
+		tee->max_read_offset = tstream->istream.istream.v_offset;
+
 	for (p = &tee->children; *p != NULL; p = &(*p)->next) {
 		if (*p == tstream) {
 			*p = tstream->next;
@@ -73,8 +83,14 @@
 	}
 
 	if (tee->children == NULL) {
+		i_assert(tee->input->v_offset <= tee->max_read_offset);
+		i_stream_skip(tee->input,
+			      tee->max_read_offset - tee->input->v_offset);
+
 		i_stream_unref(&tee->input);
 		p_free(tee->pool, tee);
+	} else {
+		tee_streams_skip(tstream->tee);
 	}
 }
 
@@ -116,9 +132,11 @@
 		data = i_stream_get_data(input, &size);
 	} else if (stream->buffer == NULL) {
 		tee_streams_update_buffer(tstream->tee);
+	} else {
+		stream->buffer = data;
 	}
 
-	stream->buffer = data;
+	i_assert(stream->buffer == data);
 	ret = size - stream->pos;
 	stream->pos = size;
 	return ret;