Mercurial > dovecot > original-hg > dovecot-1.2
changeset 7034:e527ac1a7b4b HEAD
i_stream_seek(): If parent stream is set, use skip optimization only if all
the parent streams are at their expected offsets.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sat, 22 Dec 2007 05:58:58 +0200 |
parents | 5b40343e96c7 |
children | 0f4e8b995760 |
files | src/lib/istream.c |
diffstat | 1 files changed, 19 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib/istream.c Sat Dec 22 05:49:26 2007 +0200 +++ b/src/lib/istream.c Sat Dec 22 05:58:58 2007 +0200 @@ -91,11 +91,29 @@ _stream->seek(_stream, stream->v_offset + count, FALSE); } +static bool i_stream_can_optimize_seek(struct istream *stream) +{ + uoff_t expected_offset; + + if (stream->real_stream->parent == NULL) + return TRUE; + + /* use the fast route only if the parent stream is at the + expected offset */ + expected_offset = stream->real_stream->parent_start_offset + + stream->v_offset - stream->real_stream->skip; + if (stream->real_stream->parent->v_offset != expected_offset) + return FALSE; + + return i_stream_can_optimize_seek(stream->real_stream->parent); +} + void i_stream_seek(struct istream *stream, uoff_t v_offset) { struct istream_private *_stream = stream->real_stream; - if (v_offset >= stream->v_offset) { + if (v_offset >= stream->v_offset && + i_stream_can_optimize_seek(stream)) { i_stream_skip(stream, v_offset - stream->v_offset); return; }