Mercurial > dovecot > core-2.2
changeset 9525:02badd89127e HEAD
istream: Changed default destroy() implementation not to do parent stream seeking.
The stream's v_offset may be completely different from what parent uses.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Tue, 23 Jun 2009 22:01:17 -0400 |
parents | 498965c87314 |
children | c8ff1a3722b7 |
files | src/lib/istream-limit.c src/lib/istream.c |
diffstat | 2 files changed, 17 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib/istream-limit.c Tue Jun 23 21:18:33 2009 -0400 +++ b/src/lib/istream-limit.c Tue Jun 23 22:01:17 2009 -0400 @@ -9,6 +9,21 @@ uoff_t v_size; }; +static void i_stream_limit_destroy(struct iostream_private *stream) +{ + struct limit_istream *lstream = (struct limit_istream *) stream; + uoff_t v_offset; + + v_offset = lstream->istream.parent_start_offset + + lstream->istream.istream.v_offset; + if (lstream->istream.parent->seekable || + v_offset > lstream->istream.parent->v_offset) { + /* get to same position in parent stream */ + i_stream_seek(lstream->istream.parent, v_offset); + } + i_stream_unref(&lstream->istream.parent); +} + static ssize_t i_stream_limit_read(struct istream_private *stream) { struct limit_istream *lstream = (struct limit_istream *) stream; @@ -116,6 +131,7 @@ lstream->v_size = v_size; lstream->istream.max_buffer_size = input->real_stream->max_buffer_size; + lstream->istream.iostream.destroy = i_stream_limit_destroy; lstream->istream.parent = input; lstream->istream.read = i_stream_limit_read; lstream->istream.seek = i_stream_limit_seek;
--- a/src/lib/istream.c Tue Jun 23 21:18:33 2009 -0400 +++ b/src/lib/istream.c Tue Jun 23 22:01:17 2009 -0400 @@ -481,19 +481,10 @@ static void i_stream_default_destroy(struct iostream_private *stream) { struct istream_private *_stream = (struct istream_private *)stream; - uoff_t v_offset; i_free(_stream->w_buffer); - if (_stream->parent != NULL) { - v_offset = _stream->parent_start_offset + - _stream->istream.v_offset; - if (_stream->parent->seekable || - v_offset > _stream->parent->v_offset) { - /* get to same position in parent stream */ - i_stream_seek(_stream->parent, v_offset); - } + if (_stream->parent != NULL) i_stream_unref(&_stream->parent); - } } static void