]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
istream: Added i_stream_init_parent() to lazily initialize the parent stream.
authorTimo Sirainen <tss@iki.fi>
Wed, 6 Nov 2013 19:05:51 +0000 (21:05 +0200)
committerTimo Sirainen <tss@iki.fi>
Wed, 6 Nov 2013 19:05:51 +0000 (21:05 +0200)
src/lib/istream-private.h
src/lib/istream.c

index 4077e604a679fb48eed3e602a970b4682cbc6839..80ede3021051610e4b5eb7d65bae22b18158b9f0 100644 (file)
@@ -52,6 +52,9 @@ struct istream_private {
 struct istream * ATTR_NOWARN_UNUSED_RESULT
 i_stream_create(struct istream_private *stream, struct istream *parent, int fd)
        ATTR_NULL(2);
+/* Initialize parent lazily after i_stream_create() has already been called. */
+void i_stream_init_parent(struct istream_private *_stream,
+                         struct istream *parent);
 
 void i_stream_compress(struct istream_private *stream);
 void i_stream_grow_buffer(struct istream_private *stream, size_t bytes);
index 0154266a6a09405f6affcb1911cf32414a0889d6..c4a52980eb19db8f61768351391435d6fb0e2f10 100644 (file)
@@ -703,22 +703,27 @@ i_stream_default_get_size(struct istream_private *stream,
        return 1;
 }
 
+void i_stream_init_parent(struct istream_private *_stream,
+                         struct istream *parent)
+{
+       _stream->access_counter = parent->real_stream->access_counter;
+       _stream->parent = parent;
+       _stream->parent_start_offset = parent->v_offset;
+       _stream->parent_expected_offset = parent->v_offset;
+       _stream->abs_start_offset = parent->v_offset +
+               parent->real_stream->abs_start_offset;
+       /* if parent stream is an istream-error, copy the error */
+       _stream->istream.stream_errno = parent->stream_errno;
+       _stream->istream.eof = parent->eof;
+       i_stream_ref(parent);
+}
+
 struct istream *
 i_stream_create(struct istream_private *_stream, struct istream *parent, int fd)
 {
        _stream->fd = fd;
-       if (parent != NULL) {
-               _stream->access_counter = parent->real_stream->access_counter;
-               _stream->parent = parent;
-               _stream->parent_start_offset = parent->v_offset;
-               _stream->parent_expected_offset = parent->v_offset;
-               _stream->abs_start_offset = parent->v_offset +
-                       parent->real_stream->abs_start_offset;
-               /* if parent stream is an istream-error, copy the error */
-               _stream->istream.stream_errno = parent->stream_errno;
-               _stream->istream.eof = parent->eof;
-               i_stream_ref(parent);
-       }
+       if (parent != NULL)
+               i_stream_init_parent(_stream, parent);
        _stream->istream.real_stream = _stream;
 
        if (_stream->iostream.close == NULL)