summaryrefslogtreecommitdiff
path: root/libarchive/archive_write_add_filter_xz.c
diff options
context:
space:
mode:
authorMichihiro NAKAJIMA <ggcueroad@gmail.com>2012-01-06 00:53:29 -0500
committerMichihiro NAKAJIMA <ggcueroad@gmail.com>2012-01-06 00:53:29 -0500
commite6f12d29671538f2d00f01ed2ad5ebbe0b5b5e87 (patch)
treedf86e1cc05a84c53ebb60a1a3d6f92543e844184 /libarchive/archive_write_add_filter_xz.c
parentc7d6d08b9748613f9c12bb3080fc41d53ca61ac6 (diff)
downloadlibarchive-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.c12
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) {