dovecot-2.0: ostream: Simplified implementing ostreams.

dovecot at dovecot.org dovecot at dovecot.org
Fri Oct 16 19:31:09 EEST 2009


details:   http://hg.dovecot.org/dovecot-2.0/rev/bad043de6a7a
changeset: 10083:bad043de6a7a
user:      Timo Sirainen <tss at iki.fi>
date:      Fri Oct 16 12:30:14 2009 -0400
description:
ostream: Simplified implementing ostreams.
Some functions are no longer necessary to implement. Moved some code to be
common among all ostreams.

diffstat:

4 files changed, 54 insertions(+), 84 deletions(-)
src/lib/ostream-buffer.c   |   51 ++------------------------------------
src/lib/ostream-file.c     |   27 +++++---------------
src/lib/ostream-internal.h |    1 
src/lib/ostream.c          |   59 +++++++++++++++++++++++++++++++-------------

diffs (truncated from 304 to 300 lines):

diff -r 62b37dcf173e -r bad043de6a7a src/lib/ostream-buffer.c
--- a/src/lib/ostream-buffer.c	Fri Oct 16 13:01:19 2009 +0000
+++ b/src/lib/ostream-buffer.c	Fri Oct 16 12:30:14 2009 -0400
@@ -7,39 +7,7 @@ struct buffer_ostream {
 struct buffer_ostream {
 	struct ostream_private ostream;
 	buffer_t *buf;
-	size_t max_buffer_size;
 };
-
-static void
-o_stream_buffer_set_max_buffer_size(struct iostream_private *stream,
-				 size_t max_size)
-{
-	struct buffer_ostream *bstream = (struct buffer_ostream *)stream;
-
-	bstream->max_buffer_size = max_size;
-}
-
-static void o_stream_buffer_cork(struct ostream_private *stream ATTR_UNUSED,
-				 bool set ATTR_UNUSED)
-{
-}
-
-static int o_stream_buffer_flush(struct ostream_private *stream ATTR_UNUSED)
-{
-	return 1;
-}
-
-static void
-o_stream_buffer_flush_pending(struct ostream_private *stream ATTR_UNUSED,
-			      bool set ATTR_UNUSED)
-{
-}
-
-static size_t
-o_stream_buffer_get_used_size(const struct ostream_private *stream ATTR_UNUSED)
-{
-	return 0;
-}
 
 static int o_stream_buffer_seek(struct ostream_private *stream, uoff_t offset)
 {
@@ -67,7 +35,8 @@ o_stream_buffer_sendv(struct ostream_pri
 	unsigned int i;
 
 	for (i = 0; i < iov_count; i++) {
-		left = bstream->max_buffer_size - stream->ostream.offset;
+		left = bstream->ostream.max_buffer_size -
+			stream->ostream.offset;
 		n = I_MIN(left, iov[i].iov_len);
 		buffer_write(bstream->buf, stream->ostream.offset,
 			     iov[i].iov_base, n);
@@ -79,30 +48,16 @@ o_stream_buffer_sendv(struct ostream_pri
 	return ret;
 }
 
-static off_t o_stream_buffer_send_istream(struct ostream_private *outstream,
-					  struct istream *instream)
-{
-	return io_stream_copy(&outstream->ostream, instream, 1024);
-}
-
 struct ostream *o_stream_create_buffer(buffer_t *buf)
 {
 	struct buffer_ostream *bstream;
 
 	bstream = i_new(struct buffer_ostream, 1);
-	bstream->ostream.iostream.set_max_buffer_size =
-		o_stream_buffer_set_max_buffer_size;
-
-	bstream->ostream.cork = o_stream_buffer_cork;
-	bstream->ostream.flush = o_stream_buffer_flush;
-	bstream->ostream.flush_pending = o_stream_buffer_flush_pending;
-	bstream->ostream.get_used_size = o_stream_buffer_get_used_size;
+	bstream->ostream.max_buffer_size = (size_t)-1;
 	bstream->ostream.seek = o_stream_buffer_seek;
 	bstream->ostream.sendv = o_stream_buffer_sendv;
 	bstream->ostream.write_at = o_stream_buffer_write_at;
-	bstream->ostream.send_istream = o_stream_buffer_send_istream;
 
 	bstream->buf = buf;
-	bstream->max_buffer_size = (size_t)-1;
 	return o_stream_create(&bstream->ostream);
 }
diff -r 62b37dcf173e -r bad043de6a7a src/lib/ostream-file.c
--- a/src/lib/ostream-file.c	Fri Oct 16 13:01:19 2009 +0000
+++ b/src/lib/ostream-file.c	Fri Oct 16 12:30:14 2009 -0400
@@ -37,7 +37,7 @@ struct file_ostream {
 	uoff_t real_offset;
 
 	unsigned char *buffer; /* ring-buffer */
-	size_t buffer_size, max_buffer_size, optimal_block_size;
+	size_t buffer_size, optimal_block_size;
 	size_t head, tail; /* first unsent/unused byte */
 
 	unsigned int full:1; /* if head == tail, is buffer empty or full? */
@@ -81,15 +81,6 @@ static void o_stream_file_destroy(struct
 	struct file_ostream *fstream = (struct file_ostream *)stream;
 
 	i_free(fstream->buffer);
-}
-
-static void
-o_stream_file_set_max_buffer_size(struct iostream_private *stream,
-				  size_t max_size)
-{
-	struct file_ostream *fstream = (struct file_ostream *)stream;
-
-	fstream->max_buffer_size = max_size;
 }
 
 static size_t file_buffer_get_used_size(struct file_ostream *fstream)
@@ -420,13 +411,13 @@ static void o_stream_grow_buffer(struct 
 	size_t size, new_size, end_size;
 
 	size = nearest_power(fstream->buffer_size + bytes);
-	if (size > fstream->max_buffer_size) {
+	if (size > fstream->ostream.max_buffer_size) {
 		/* limit the size */
-		size = fstream->max_buffer_size;
+		size = fstream->ostream.max_buffer_size;
 	} else if (fstream->corked) {
 		/* try to use optimal buffer size with corking */
 		new_size = I_MIN(fstream->optimal_block_size,
-				 fstream->max_buffer_size);
+				 fstream->ostream.max_buffer_size);
 		if (new_size > size)
 			size = new_size;
 	}
@@ -545,7 +536,7 @@ static ssize_t o_stream_file_sendv(struc
 	}
 
 	optimal_size = I_MIN(fstream->optimal_block_size,
-			     fstream->max_buffer_size);
+			     fstream->ostream.max_buffer_size);
 	if (IS_STREAM_EMPTY(fstream) &&
 	    (!fstream->corked || size >= optimal_size)) {
 		/* send immediately */
@@ -888,8 +879,6 @@ o_stream_create_fd_common(int fd, bool a
 
 	fstream->ostream.iostream.close = o_stream_file_close;
 	fstream->ostream.iostream.destroy = o_stream_file_destroy;
-	fstream->ostream.iostream.set_max_buffer_size =
-		o_stream_file_set_max_buffer_size;
 
 	fstream->ostream.cork = o_stream_file_cork;
 	fstream->ostream.flush = o_stream_file_flush;
@@ -931,7 +920,7 @@ o_stream_create_fd(int fd, size_t max_bu
 	off_t offset;
 
 	fstream = o_stream_create_fd_common(fd, autoclose_fd);
-	fstream->max_buffer_size = max_buffer_size;
+	fstream->ostream.max_buffer_size = max_buffer_size;
 	ostream = o_stream_create(&fstream->ostream);
 
 	offset = lseek(fd, 0, SEEK_CUR);
@@ -948,7 +937,7 @@ o_stream_create_fd(int fd, size_t max_bu
 	}
 
 	if (max_buffer_size == 0)
-		fstream->max_buffer_size = fstream->optimal_block_size;
+		fstream->ostream.max_buffer_size = fstream->optimal_block_size;
 
 	return ostream;
 }
@@ -964,7 +953,7 @@ o_stream_create_fd_file(int fd, uoff_t o
 
 	fstream = o_stream_create_fd_common(fd, autoclose_fd);
 	fstream_init_file(fstream);
-	fstream->max_buffer_size = fstream->optimal_block_size;
+	fstream->ostream.max_buffer_size = fstream->optimal_block_size;
 	fstream->real_offset = offset;
 	fstream->buffer_offset = offset;
 
diff -r 62b37dcf173e -r bad043de6a7a src/lib/ostream-internal.h
--- a/src/lib/ostream-internal.h	Fri Oct 16 13:01:19 2009 +0000
+++ b/src/lib/ostream-internal.h	Fri Oct 16 12:30:14 2009 -0400
@@ -24,6 +24,7 @@ struct ostream_private {
 
 /* data: */
 	struct ostream ostream;
+	size_t max_buffer_size;
 
 	stream_flush_callback_t *callback;
 	void *context;
diff -r 62b37dcf173e -r bad043de6a7a src/lib/ostream.c
--- a/src/lib/ostream.c	Fri Oct 16 13:01:19 2009 +0000
+++ b/src/lib/ostream.c	Fri Oct 16 12:30:14 2009 -0400
@@ -48,7 +48,12 @@ void o_stream_unset_flush_callback(struc
 
 void o_stream_set_max_buffer_size(struct ostream *stream, size_t max_size)
 {
-	io_stream_set_max_buffer_size(&stream->real_stream->iostream, max_size);
+	if (stream->real_stream->iostream.set_max_buffer_size != NULL) {
+		io_stream_set_max_buffer_size(&stream->real_stream->iostream,
+					      max_size);
+	} else {
+		stream->real_stream->max_buffer_size = max_size;
+	}
 }
 
 void o_stream_cork(struct ostream *stream)
@@ -58,7 +63,8 @@ void o_stream_cork(struct ostream *strea
 	if (unlikely(stream->closed))
 		return;
 
-	_stream->cork(_stream, TRUE);
+	if (_stream->cork != NULL)
+		_stream->cork(_stream, TRUE);
 }
 
 void o_stream_uncork(struct ostream *stream)
@@ -68,21 +74,24 @@ void o_stream_uncork(struct ostream *str
 	if (unlikely(stream->closed))
 		return;
 
-	_stream->cork(_stream, FALSE);
+	if (_stream->cork != NULL)
+		_stream->cork(_stream, FALSE);
 }
 
 int o_stream_flush(struct ostream *stream)
 {
 	struct ostream_private *_stream = stream->real_stream;
-	int ret;
-
-	if (unlikely(stream->closed))
-		return -1;
-
-	stream->stream_errno = 0;
-	if (unlikely((ret = _stream->flush(_stream)) < 0)) {
-		i_assert(stream->stream_errno != 0);
-		stream->last_failed_errno = stream->stream_errno;
+	int ret = 1;
+
+	if (unlikely(stream->closed))
+		return -1;
+
+	stream->stream_errno = 0;
+	if (_stream->flush != NULL) {
+		if (unlikely((ret = _stream->flush(_stream)) < 0)) {
+			i_assert(stream->stream_errno != 0);
+			stream->last_failed_errno = stream->stream_errno;
+		}
 	}
 	return ret;
 }
@@ -94,14 +103,16 @@ void o_stream_set_flush_pending(struct o
 	if (unlikely(stream->closed))
 		return;
 
-	_stream->flush_pending(_stream, set);
+	if (_stream->flush_pending != NULL)
+		_stream->flush_pending(_stream, set);
 }
 
 size_t o_stream_get_buffer_used_size(const struct ostream *stream)
 {
 	const struct ostream_private *_stream = stream->real_stream;
 
-	return _stream->get_used_size(_stream);
+	return _stream->get_used_size == NULL ? 0 :
+		_stream->get_used_size(_stream);
 }
 
 int o_stream_seek(struct ostream *stream, uoff_t offset)
@@ -112,9 +123,15 @@ int o_stream_seek(struct ostream *stream
 		return -1;
 
 	stream->stream_errno = 0;
-	if (unlikely(_stream->seek(_stream, offset) < 0)) {
-		i_assert(stream->stream_errno != 0);
-		stream->last_failed_errno = stream->stream_errno;
+	if (_stream->seek != NULL) {
+		if (unlikely(_stream->seek(_stream, offset) < 0)) {
+			i_assert(stream->stream_errno != 0);
+			stream->last_failed_errno = stream->stream_errno;
+		}
+	} else {
+		stream->stream_errno = EPIPE;
+		stream->last_failed_errno = EPIPE;
+		return -1;
 	}
 	return 1;
 }
@@ -196,9 +213,17 @@ int o_stream_pwrite(struct ostream *stre
 	return ret;
 }
 
+static off_t o_stream_default_send_istream(struct ostream_private *outstream,
+					   struct istream *instream)
+{
+	return io_stream_copy(&outstream->ostream, instream, 1024);
+}
+
 struct ostream *o_stream_create(struct ostream_private *_stream)
 {
 	_stream->ostream.real_stream = _stream;
+	if (_stream->send_istream == NULL)


More information about the dovecot-cvs mailing list