diff options
author | Michihiro NAKAJIMA <ggcueroad@gmail.com> | 2012-01-06 00:53:29 -0500 |
---|---|---|
committer | Michihiro NAKAJIMA <ggcueroad@gmail.com> | 2012-01-06 00:53:29 -0500 |
commit | e6f12d29671538f2d00f01ed2ad5ebbe0b5b5e87 (patch) | |
tree | df86e1cc05a84c53ebb60a1a3d6f92543e844184 /libarchive/archive_write_add_filter_xz.c | |
parent | c7d6d08b9748613f9c12bb3080fc41d53ca61ac6 (diff) | |
download | libarchive-e6f12d29671538f2d00f01ed2ad5ebbe0b5b5e87.tar.gz |
The size of output buffer should be the multiple number of the write block size
in order to reduce an extra copy of output data at archive_write.c.
SVN-Revision: 4090
Diffstat (limited to 'libarchive/archive_write_add_filter_xz.c')
-rw-r--r-- | libarchive/archive_write_add_filter_xz.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/libarchive/archive_write_add_filter_xz.c b/libarchive/archive_write_add_filter_xz.c index b0677522..6bf094bc 100644 --- a/libarchive/archive_write_add_filter_xz.c +++ b/libarchive/archive_write_add_filter_xz.c @@ -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) { |