]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-compression: Use i_stream_try_alloc*()
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Fri, 27 Oct 2017 17:49:07 +0000 (20:49 +0300)
committerTimo Sirainen <tss@dovecot.fi>
Wed, 1 Nov 2017 11:45:51 +0000 (13:45 +0200)
src/lib-compression/istream-bzlib.c
src/lib-compression/istream-lzma.c
src/lib-compression/istream-zlib.c

index c73673f8e61a8acdf6fca54a732a7a0c00cceb4e..fd0f2ffaa56bc2ff064915675101a7441acf0555 100644 (file)
@@ -78,25 +78,13 @@ static ssize_t i_stream_bzlib_read(struct istream_private *stream)
        }
        zstream->high_pos = 0;
 
-       if (stream->pos + CHUNK_SIZE > stream->buffer_size) {
-               /* try to keep at least CHUNK_SIZE available */
-               if (!zstream->marked && stream->skip > 0) {
-                       /* don't try to keep anything cached if we don't
-                          have a seek mark. */
-                       i_stream_compress(stream);
-               }
-               if (stream->buffer_size < i_stream_get_max_buffer_size(&stream->istream))
-                       i_stream_grow_buffer(stream, CHUNK_SIZE);
-
-               if (stream->pos == stream->buffer_size) {
-                       if (stream->skip > 0) {
-                               /* lose our buffer cache */
-                               i_stream_compress(stream);
-                       }
-
-                       if (stream->pos == stream->buffer_size)
-                               return -2; /* buffer full */
-               }
+       if (!zstream->marked) {
+               if (!i_stream_try_alloc(stream, CHUNK_SIZE, &out_size))
+                       return -2; /* buffer full */
+       } else {
+               /* try to avoid compressing, so we can quickly seek backwards */
+               if (!i_stream_try_alloc_avoid_compress(stream, CHUNK_SIZE, &out_size))
+                       return -2; /* buffer full */
        }
 
        if (i_stream_read_more(stream->parent, &data, &size) < 0) {
@@ -119,7 +107,6 @@ static ssize_t i_stream_bzlib_read(struct istream_private *stream)
        zstream->zs.next_in = (char *)data;
        zstream->zs.avail_in = size;
 
-       out_size = stream->buffer_size - stream->pos;
        zstream->zs.next_out = (char *)stream->w_buffer + stream->pos;
        zstream->zs.avail_out = out_size;
        ret = BZ2_bzDecompress(&zstream->zs);
index 430e6d1b36e893875b1476a98ac24dc63c9e6916..9231c73c5b5a6fef0f95693b8524a0d6d942311e 100644 (file)
@@ -87,25 +87,13 @@ static ssize_t i_stream_lzma_read(struct istream_private *stream)
        }
        zstream->high_pos = 0;
 
-       if (stream->pos + CHUNK_SIZE > stream->buffer_size) {
-               /* try to keep at least CHUNK_SIZE available */
-               if (!zstream->marked && stream->skip > 0) {
-                       /* don't try to keep anything cached if we don't
-                          have a seek mark. */
-                       i_stream_compress(stream);
-               }
-               if (stream->buffer_size < i_stream_get_max_buffer_size(&stream->istream))
-                       i_stream_grow_buffer(stream, CHUNK_SIZE);
-
-               if (stream->pos == stream->buffer_size) {
-                       if (stream->skip > 0) {
-                               /* lose our buffer cache */
-                               i_stream_compress(stream);
-                       }
-
-                       if (stream->pos == stream->buffer_size)
-                               return -2; /* buffer full */
-               }
+       if (!zstream->marked) {
+               if (!i_stream_try_alloc(stream, CHUNK_SIZE, &out_size))
+                       return -2; /* buffer full */
+       } else {
+               /* try to avoid compressing, so we can quickly seek backwards */
+               if (!i_stream_try_alloc_avoid_compress(stream, CHUNK_SIZE, &out_size))
+                       return -2; /* buffer full */
        }
 
        if (i_stream_read_more(stream->parent, &data, &size) < 0) {
@@ -128,7 +116,6 @@ static ssize_t i_stream_lzma_read(struct istream_private *stream)
        zstream->strm.next_in = data;
        zstream->strm.avail_in = size;
 
-       out_size = stream->buffer_size - stream->pos;
        zstream->strm.next_out = stream->w_buffer + stream->pos;
        zstream->strm.avail_out = out_size;
        ret = lzma_code(&zstream->strm, LZMA_RUN);
index 5f68d75d27bbb600e28976cea662dba0030957e6..51bbde12ce545f9c02d4fad1585f4c19f192c32d 100644 (file)
@@ -241,25 +241,13 @@ static ssize_t i_stream_zlib_read(struct istream_private *stream)
        }
        zstream->high_pos = 0;
 
-       if (stream->pos + CHUNK_SIZE > stream->buffer_size) {
-               /* try to keep at least CHUNK_SIZE available */
-               if (!zstream->marked && stream->skip > 0) {
-                       /* don't try to keep anything cached if we don't
-                          have a seek mark. */
-                       i_stream_compress(stream);
-               }
-               if (stream->buffer_size < i_stream_get_max_buffer_size(&stream->istream))
-                       i_stream_grow_buffer(stream, CHUNK_SIZE);
-
-               if (stream->pos == stream->buffer_size) {
-                       if (stream->skip > 0) {
-                               /* lose our buffer cache */
-                               i_stream_compress(stream);
-                       }
-
-                       if (stream->pos == stream->buffer_size)
-                               return -2; /* buffer full */
-               }
+       if (!zstream->marked) {
+               if (!i_stream_try_alloc(stream, CHUNK_SIZE, &out_size))
+                       return -2; /* buffer full */
+       } else {
+               /* try to avoid compressing, so we can quickly seek backwards */
+               if (!i_stream_try_alloc_avoid_compress(stream, CHUNK_SIZE, &out_size))
+                       return -2; /* buffer full */
        }
 
        if (i_stream_read_more(stream->parent, &data, &size) < 0) {
@@ -282,7 +270,6 @@ static ssize_t i_stream_zlib_read(struct istream_private *stream)
        zstream->zs.next_in = (void *)data;
        zstream->zs.avail_in = size;
 
-       out_size = stream->buffer_size - stream->pos;
        zstream->zs.next_out = stream->w_buffer + stream->pos;
        zstream->zs.avail_out = out_size;
        ret = inflate(&zstream->zs, Z_SYNC_FLUSH);