Mercurial > dovecot > original-hg > dovecot-1.2
changeset 2187:8f0e6c3b13c5 HEAD
read() less often
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sun, 20 Jun 2004 01:06:52 +0300 |
parents | 6eb96c8aaac3 |
children | d7a314446b47 |
files | src/lib-storage/index/mbox/istream-raw-mbox.c |
diffstat | 1 files changed, 25 insertions(+), 20 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-storage/index/mbox/istream-raw-mbox.c Sun Jun 20 01:06:30 2004 +0300 +++ b/src/lib-storage/index/mbox/istream-raw-mbox.c Sun Jun 20 01:06:52 2004 +0300 @@ -148,33 +148,38 @@ stream->skip = 0; stream->buffer = NULL; + ret = 0; do { - ret = i_stream_read(rstream->input); buf = i_stream_get_data(rstream->input, &pos); - } while (ret > 0 && (pos == 1 || - stream->istream.v_offset + pos <= - rstream->input_peak_offset)); + if (pos > 1 && + stream->istream.v_offset + pos > rstream->input_peak_offset) + break; + ret = i_stream_read(rstream->input); + } while (ret > 0); if (ret < 0) { - if (ret == -2) - return -2; - - /* we've read the whole file, final byte should be - the \n trailer */ - if (pos > 0 && buf[pos-1] == '\n') - pos--; + if (ret == -2) { + if (stream->istream.v_offset + pos == + rstream->input_peak_offset) + return -2; + } else { + /* we've read the whole file, final byte should be + the \n trailer */ + if (pos > 0 && buf[pos-1] == '\n') + pos--; - i_assert(pos >= stream->pos); - ret = pos == stream->pos ? -1 : - (ssize_t)(pos - stream->pos); + i_assert(pos >= stream->pos); + ret = pos == stream->pos ? -1 : + (ssize_t)(pos - stream->pos); - stream->buffer = buf; - stream->pos = pos; + stream->buffer = buf; + stream->pos = pos; - rstream->eom = TRUE; - rstream->eof = TRUE; - handle_end_of_mail(rstream, pos); - return ret < 0 ? _read(stream) : ret; + rstream->eom = TRUE; + rstream->eof = TRUE; + handle_end_of_mail(rstream, pos); + return ret < 0 ? _read(stream) : ret; + } } if (stream->istream.v_offset == rstream->from_offset) {