dovecot-1.1: istream-tee: Minor cleanups, assert and a potential...
dovecot at dovecot.org
dovecot at dovecot.org
Thu Feb 5 00:50:25 EET 2009
details: http://hg.dovecot.org/dovecot-1.1/rev/e1cac844aa1e
changeset: 8153:e1cac844aa1e
user: Timo Sirainen <tss at iki.fi>
date: Wed Feb 04 17:50:05 2009 -0500
description:
istream-tee: Minor cleanups, assert and a potential fix.
diffstat:
1 file changed, 11 insertions(+), 3 deletions(-)
src/lib/istream-tee.c | 14 +++++++++++---
diffs (37 lines):
diff -r 8e74a4265264 -r e1cac844aa1e src/lib/istream-tee.c
--- a/src/lib/istream-tee.c Wed Feb 04 12:30:07 2009 -0500
+++ b/src/lib/istream-tee.c Wed Feb 04 17:50:05 2009 -0500
@@ -112,12 +112,20 @@ static ssize_t i_stream_tee_read(struct
uoff_t last_high_offset;
ssize_t ret;
+ if (stream->buffer == NULL) {
+ /* initial read */
+ tee_streams_update_buffer(tstream->tee);
+ }
data = i_stream_get_data(input, &size);
+ /* last_high_offset contains how far we have read this child tee stream
+ so far. input->v_offset + size contains how much is available in
+ the parent stream without having to read more. */
last_high_offset = stream->istream.v_offset +
- (tstream->istream.pos - tstream->istream.skip);
+ (stream->pos - stream->skip);
i_assert(last_high_offset <= input->v_offset + size);
if (last_high_offset == input->v_offset + size) {
+ /* we've read everything, need to read more */
tee_streams_skip(tstream->tee);
ret = i_stream_read(input);
if (ret <= 0) {
@@ -133,9 +141,9 @@ static ssize_t i_stream_tee_read(struct
}
tee_streams_update_buffer(tstream->tee);
data = i_stream_get_data(input, &size);
- } else if (stream->buffer == NULL) {
- tee_streams_update_buffer(tstream->tee);
} else {
+ /* there's still some data available from parent */
+ i_assert(stream->pos < size);
stream->buffer = data;
}
More information about the dovecot-cvs
mailing list