dovecot-2.0: ostream: If cork method isn't implemented, keep tra...
dovecot at dovecot.org
dovecot at dovecot.org
Sun Feb 14 21:49:44 EET 2010
details: http://hg.dovecot.org/dovecot-2.0/rev/3b544841d5d7
changeset: 10708:3b544841d5d7
user: Timo Sirainen <tss at iki.fi>
date: Sun Feb 14 21:49:13 2010 +0200
description:
ostream: If cork method isn't implemented, keep track of corking state internally.
diffstat:
src/lib/ostream-file.c | 15 +++++++--------
src/lib/ostream-internal.h | 2 ++
src/lib/ostream.c | 6 +++++-
3 files changed, 14 insertions(+), 9 deletions(-)
diffs (110 lines):
diff -r 72a345621cd2 -r 3b544841d5d7 src/lib/ostream-file.c
--- a/src/lib/ostream-file.c Sat Feb 13 13:49:31 2010 +0200
+++ b/src/lib/ostream-file.c Sun Feb 14 21:49:13 2010 +0200
@@ -42,7 +42,6 @@
unsigned int full:1; /* if head == tail, is buffer empty or full? */
unsigned int file:1;
- unsigned int corked:1;
unsigned int flush_pending:1;
unsigned int socket_cork_set:1;
unsigned int no_socket_cork:1;
@@ -132,7 +131,7 @@
static void o_stream_socket_cork(struct file_ostream *fstream)
{
- if (fstream->corked && !fstream->socket_cork_set) {
+ if (fstream->ostream.corked && !fstream->socket_cork_set) {
if (!fstream->no_socket_cork) {
if (net_set_cork(fstream->fd, TRUE) < 0)
fstream->no_socket_cork = TRUE;
@@ -324,7 +323,7 @@
struct file_ostream *fstream = (struct file_ostream *)stream;
int ret;
- if (fstream->corked != set && !stream->ostream.closed) {
+ if (stream->corked != set && !stream->ostream.closed) {
if (set && fstream->io != NULL)
io_remove(&fstream->io);
else if (!set) {
@@ -344,7 +343,7 @@
fstream->no_socket_cork = TRUE;
fstream->socket_cork_set = FALSE;
}
- fstream->corked = set;
+ stream->corked = set;
}
}
@@ -361,7 +360,7 @@
struct file_ostream *fstream = (struct file_ostream *) stream;
fstream->flush_pending = set;
- if (set && !fstream->corked && fstream->io == NULL) {
+ if (set && !stream->corked && fstream->io == NULL) {
fstream->io = io_add(fstream->fd, IO_WRITE,
stream_send_io, fstream);
}
@@ -414,7 +413,7 @@
if (size > fstream->ostream.max_buffer_size) {
/* limit the size */
size = fstream->ostream.max_buffer_size;
- } else if (fstream->corked) {
+ } else if (fstream->ostream.corked) {
/* try to use optimal buffer size with corking */
new_size = I_MIN(fstream->optimal_block_size,
fstream->ostream.max_buffer_size);
@@ -509,7 +508,7 @@
}
if (sent != 0 && fstream->io == NULL &&
- !fstream->corked && !fstream->file) {
+ !fstream->ostream.corked && !fstream->file) {
fstream->io = io_add(fstream->fd, IO_WRITE, stream_send_io,
fstream);
}
@@ -538,7 +537,7 @@
optimal_size = I_MIN(fstream->optimal_block_size,
fstream->ostream.max_buffer_size);
if (IS_STREAM_EMPTY(fstream) &&
- (!fstream->corked || size >= optimal_size)) {
+ (!stream->corked || size >= optimal_size)) {
/* send immediately */
ret = o_stream_writev(fstream, iov, iov_count);
if (ret < 0)
diff -r 72a345621cd2 -r 3b544841d5d7 src/lib/ostream-internal.h
--- a/src/lib/ostream-internal.h Sat Feb 13 13:49:31 2010 +0200
+++ b/src/lib/ostream-internal.h Sun Feb 14 21:49:13 2010 +0200
@@ -28,6 +28,8 @@
stream_flush_callback_t *callback;
void *context;
+
+ unsigned int corked:1;
};
struct ostream *o_stream_create(struct ostream_private *_stream);
diff -r 72a345621cd2 -r 3b544841d5d7 src/lib/ostream.c
--- a/src/lib/ostream.c Sat Feb 13 13:49:31 2010 +0200
+++ b/src/lib/ostream.c Sun Feb 14 21:49:13 2010 +0200
@@ -65,6 +65,8 @@
if (_stream->cork != NULL)
_stream->cork(_stream, TRUE);
+ else
+ _stream->corked = TRUE;
}
void o_stream_uncork(struct ostream *stream)
@@ -76,8 +78,10 @@
if (_stream->cork != NULL)
_stream->cork(_stream, FALSE);
- else
+ else {
+ _stream->corked = FALSE;
(void)o_stream_flush(stream);
+ }
}
int o_stream_flush(struct ostream *stream)
More information about the dovecot-cvs
mailing list