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