]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
The size of output buffer should be the multiple number of the write block size
authorMichihiro NAKAJIMA <ggcueroad@gmail.com>
Fri, 6 Jan 2012 05:53:29 +0000 (00:53 -0500)
committerMichihiro NAKAJIMA <ggcueroad@gmail.com>
Fri, 6 Jan 2012 05:53:29 +0000 (00:53 -0500)
in order to reduce an extra copy of output data at archive_write.c.

SVN-Revision: 4090

libarchive/archive_write.c
libarchive/archive_write_add_filter_bzip2.c
libarchive/archive_write_add_filter_compress.c
libarchive/archive_write_add_filter_gzip.c
libarchive/archive_write_add_filter_xz.c
libarchive/archive_write_set_format_7zip.c

index f38e5c11c6569703d45ecb7d7075fbcb740ef3c3..261a3bf0920679ef9ae266653c8e6ef1613916c8 100644 (file)
@@ -380,7 +380,7 @@ archive_write_client_write(struct archive_write_filter *f,
                }
        }
 
-       while ((size_t)remaining > state->buffer_size) {
+       while ((size_t)remaining >= state->buffer_size) {
                /* Write out full blocks directly to client. */
                bytes_written = (a->client_writer)(&a->archive,
                    a->client_data, buff, state->buffer_size);
index e0d07a9ff7c794ae5f3cb89491280a94415e4b93..24e057177cc5ccfafeab06c6d7ab13187eeca998 100644 (file)
@@ -133,10 +133,18 @@ archive_compressor_bzip2_open(struct archive_write_filter *f)
        if (ret != 0)
                return (ret);
 
-       /* TODO: Find a better way to size this.  (Maybe look at the */
-       /* block size expected by the following filter?) */
        if (data->compressed == NULL) {
-               data->compressed_buffer_size = 65536;
+               size_t bs = 65536, bpb;
+               if (f->archive->magic == ARCHIVE_WRITE_MAGIC) {
+                       /* Buffer size should be a multiple number of the of bytes
+                        * per block for performance. */
+                       bpb = archive_write_get_bytes_per_block(f->archive);
+                       if (bpb > bs)
+                               bs = bpb;
+                       else if (bpb != 0)
+                               bs -= bs % bpb;
+               }
+               data->compressed_buffer_size = bs;
                data->compressed
                    = (char *)malloc(data->compressed_buffer_size);
                if (data->compressed == NULL) {
index 465ff0e77bd19cfd49bc787b67e118b1a8ab8039..e29eebd9b47ba7c3c1ed3f7f25f4ad59ccf66885 100644 (file)
@@ -148,6 +148,7 @@ archive_compressor_compress_open(struct archive_write_filter *f)
 {
        int ret;
        struct private_data *state;
+       size_t bs = 65536, bpb;
 
        f->code = ARCHIVE_COMPRESSION_COMPRESS;
        f->name = "compress";
@@ -163,7 +164,16 @@ archive_compressor_compress_open(struct archive_write_filter *f)
                return (ARCHIVE_FATAL);
        }
 
-       state->compressed_buffer_size = 65536;
+       if (f->archive->magic == ARCHIVE_WRITE_MAGIC) {
+               /* Buffer size should be a multiple number of the of bytes
+                * per block for performance. */
+               bpb = archive_write_get_bytes_per_block(f->archive);
+               if (bpb > bs)
+                       bs = bpb;
+               else if (bpb != 0)
+                       bs -= bs % bpb;
+       }
+       state->compressed_buffer_size = bs;
        state->compressed = malloc(state->compressed_buffer_size);
 
        if (state->compressed == NULL) {
index 786ae98ac020149328e8e2c41c52c8b936151340..32326c0d974fc8f9a66c8d70519b99801e72cb7c 100644 (file)
@@ -135,7 +135,17 @@ archive_compressor_gzip_open(struct archive_write_filter *f)
                return (ret);
 
        if (data->compressed == NULL) {
-               data->compressed_buffer_size = 65536;
+               size_t bs = 65536, bpb;
+               if (f->archive->magic == ARCHIVE_WRITE_MAGIC) {
+                       /* Buffer size should be a multiple number of the of bytes
+                        * per block for performance. */
+                       bpb = archive_write_get_bytes_per_block(f->archive);
+                       if (bpb > bs)
+                               bs = bpb;
+                       else if (bpb != 0)
+                               bs -= bs % bpb;
+               }
+               data->compressed_buffer_size = bs;
                data->compressed
                    = (unsigned char *)malloc(data->compressed_buffer_size);
                if (data->compressed == NULL) {
index b0677522455f4c5bbbbdf9d87e9df200875458c1..6bf094bc93ec00791ac2c65069453b87d3deed02 100644 (file)
@@ -298,7 +298,17 @@ archive_compressor_xz_open(struct archive_write_filter *f)
                return (ret);
 
        if (data->compressed == NULL) {
-               data->compressed_buffer_size = 65536;
+               size_t bs = 65536, bpb;
+               if (f->archive->magic == ARCHIVE_WRITE_MAGIC) {
+                       /* Buffer size should be a multiple number of the of bytes
+                        * per block for performance. */
+                       bpb = archive_write_get_bytes_per_block(f->archive);
+                       if (bpb > bs)
+                               bs = bpb;
+                       else if (bpb != 0)
+                               bs -= bs % bpb;
+               }
+               data->compressed_buffer_size = bs;
                data->compressed
                    = (unsigned char *)malloc(data->compressed_buffer_size);
                if (data->compressed == NULL) {
index 022b3a42fa9eb9fd5b9f23f84f13cb8131eaa8b6..69d073f74169df87de801266b125017e82f10b2d 100644 (file)
@@ -199,7 +199,7 @@ struct _7zip {
        /*
         * Compressed data buffer.
         */
-       unsigned char            wbuff[1024 * 64];
+       unsigned char            wbuff[512 * 20 * 6];
        size_t                   wbuff_remaining;
 
        /*