# HG changeset patch # User Timo Sirainen # Date 1030998212 -10800 # Node ID 9b87ee7cc19fc525aa762924bc355d8468add5c1 # Parent f9522c8629b85f74558e6b114f7bf8fce7a2b58c If we're corked, try to buffer the data instead of immediately trying to write it. But is less syscalls faster than memcpy()ing?.. diff -r f9522c8629b8 -r 9b87ee7cc19f src/lib/iobuffer.c --- a/src/lib/iobuffer.c Mon Sep 02 22:37:35 2002 +0300 +++ b/src/lib/iobuffer.c Mon Sep 02 23:23:32 2002 +0300 @@ -369,10 +369,9 @@ { i_assert(!buf->receive); - if (!buf->file && !buf->corked) { + if (!buf->file && !buf->corked) net_set_cork(buf->fd, TRUE); - buf->corked = TRUE; - } + buf->corked = TRUE; } static void buffer_alloc_more(IOBuffer *buf, unsigned int size) @@ -410,7 +409,7 @@ int io_buffer_send(IOBuffer *buf, const void *data, unsigned int size) { - int ret; + int i, corked, ret; i_assert(!buf->receive); i_assert(data != NULL); @@ -420,32 +419,42 @@ if (buf->closed) return -1; - if (buf->pos == 0) { - /* buffer is empty, try to send the data immediately */ - ret = buf->file ? my_write(buf->fd, data, size) : - net_transmit(buf->fd, data, size); - if (ret < 0) { - /* disconnected */ - buf->closed = TRUE; - return -1; + /* if we're corked, first try adding it to buffer. if it's larger + than the buffer, send it immediately. */ + corked = buf->corked; + for (i = 0; i < 2; i++) { + if (buf->pos == 0 && !corked) { + /* buffer is empty, try to send the data immediately */ + ret = buf->file ? my_write(buf->fd, data, size) : + net_transmit(buf->fd, data, size); + if (ret < 0) { + /* disconnected */ + buf->closed = TRUE; + return -1; + } + + buf->offset += ret; + data = (const char *) data + ret; + size -= ret; } - buf->offset += ret; - data = (const char *) data + ret; - size -= ret; - } + if (size == 0) { + /* all sent */ + return 1; + } + + if (io_buffer_get_space(buf, size) != NULL) + break; - if (size == 0) { - /* all sent */ - return 1; - } - - if (io_buffer_get_space(buf, size) == NULL) { - if (buf->blocking) { - /* if we don't have space, we block */ - return io_buffer_send_blocking(buf, data, size); + if (corked) + corked = FALSE; + else { + if (buf->blocking) { + /* if we don't have space, we block */ + return io_buffer_send_blocking(buf, data, size); + } + return -2; } - return -2; } /* add to buffer */ @@ -877,7 +886,7 @@ i_assert(size <= INT_MAX); i_assert(!buf->receive); - if (buf->pos == 0) { + if (buf->pos == 0 && !buf->corked) { /* buffer is empty, try to send the data immediately */ ret = buf->file ? my_write(buf->fd, buf->buffer, size) : net_transmit(buf->fd, buf->buffer, size);