dovecot-2.2: istream: Added i_stream_init_parent() to lazily ini...

dovecot at dovecot.org dovecot at dovecot.org
Wed Nov 6 23:01:13 EET 2013


details:   http://hg.dovecot.org/dovecot-2.2/rev/1c9ecb6bcccc
changeset: 16942:1c9ecb6bcccc
user:      Timo Sirainen <tss at iki.fi>
date:      Wed Nov 06 21:05:51 2013 +0200
description:
istream: Added i_stream_init_parent() to lazily initialize the parent stream.

diffstat:

 src/lib/istream-private.h |   3 +++
 src/lib/istream.c         |  29 +++++++++++++++++------------
 2 files changed, 20 insertions(+), 12 deletions(-)

diffs (56 lines):

diff -r e67095b8486e -r 1c9ecb6bcccc src/lib/istream-private.h
--- a/src/lib/istream-private.h	Wed Nov 06 19:03:10 2013 +0200
+++ b/src/lib/istream-private.h	Wed Nov 06 21:05:51 2013 +0200
@@ -52,6 +52,9 @@
 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);
diff -r e67095b8486e -r 1c9ecb6bcccc src/lib/istream.c
--- a/src/lib/istream.c	Wed Nov 06 19:03:10 2013 +0200
+++ b/src/lib/istream.c	Wed Nov 06 21:05:51 2013 +0200
@@ -703,22 +703,27 @@
 	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)


More information about the dovecot-cvs mailing list