From: Rui Paulo Date: Mon, 9 Feb 2015 18:15:38 +0000 (-0800) Subject: libarchive: use lzma_stream_encoder_mt() if it's available. X-Git-Tag: v3.1.900a~121^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a580c98e3b6d86fce47c716c2b966b8e720a91cf;p=thirdparty%2Flibarchive.git libarchive: use lzma_stream_encoder_mt() if it's available. This is the multi-threaded stream encoder version of lzma that brings significant speed improvements. libarchive is using all the available threads when lzma_stream_encoder_mt() is present. --- diff --git a/configure.ac b/configure.ac index 739cb0209..92a9ff93a 100644 --- a/configure.ac +++ b/configure.ac @@ -12,13 +12,13 @@ m4_define([BSDTAR_VERSION_S],LIBARCHIVE_VERSION_S()) m4_define([BSDCPIO_VERSION_S],LIBARCHIVE_VERSION_S()) m4_define([BSDCAT_VERSION_S],LIBARCHIVE_VERSION_S()) -AC_PREREQ(2.65) +AC_PREREQ([2.69]) # # Now starts the "real" configure script. # -AC_INIT([libarchive],LIBARCHIVE_VERSION_S(),[libarchive-discuss@googlegroups.com]) +AC_INIT([libarchive],[LIBARCHIVE_VERSION_S()],[libarchive-discuss@googlegroups.com]) # Make sure the srcdir contains "libarchive" directory AC_CONFIG_SRCDIR([libarchive]) # Use auxiliary subscripts from this subdirectory (cleans up root) @@ -364,6 +364,7 @@ AC_ARG_WITH([lzma], if test "x$with_lzma" != "xno"; then AC_CHECK_HEADERS([lzma.h]) AC_CHECK_LIB(lzma,lzma_stream_decoder) + AC_CHECK_FUNCS([lzma_stream_encoder_mt]) fi AC_ARG_WITH([lzo2], @@ -472,7 +473,7 @@ fi # Checks for typedefs, structures, and compiler characteristics. AC_C_CONST -# AC_TYPE_UID_T defaults to "int", which is incorrect for MinGW +# la_TYPE_UID_T defaults to "int", which is incorrect for MinGW # and MSVC. Use a customized version. la_TYPE_UID_T AC_TYPE_MODE_T diff --git a/libarchive/archive_write_add_filter_xz.c b/libarchive/archive_write_add_filter_xz.c index fa73311e7..b6c76c6e3 100644 --- a/libarchive/archive_write_add_filter_xz.c +++ b/libarchive/archive_write_add_filter_xz.c @@ -221,16 +221,30 @@ archive_compressor_xz_init_stream(struct archive_write_filter *f, { static const lzma_stream lzma_stream_init_data = LZMA_STREAM_INIT; int ret; +#ifdef HAVE_LZMA_STREAM_ENCODER_MT + lzma_mt mt_options; +#endif data->stream = lzma_stream_init_data; data->stream.next_out = data->compressed; data->stream.avail_out = data->compressed_buffer_size; - if (f->code == ARCHIVE_FILTER_XZ) - ret = lzma_stream_encoder(&(data->stream), - data->lzmafilters, LZMA_CHECK_CRC64); - else if (f->code == ARCHIVE_FILTER_LZMA) + if (f->code == ARCHIVE_FILTER_XZ) { +#ifdef HAVE_LZMA_STREAM_ENCODER_MT + if (lzma_cputhreads() > 1) { + bzero(&mt_options, sizeof(mt_options)); + mt_options.threads = lzma_cputhreads(); + mt_options.timeout = 300; + mt_options.filters = data->lzmafilters; + mt_options.check = LZMA_CHECK_CRC64; + ret = lzma_stream_encoder_mt(&(data->stream), + &mt_options); + } else +#endif + ret = lzma_stream_encoder(&(data->stream), + data->lzmafilters, LZMA_CHECK_CRC64); + } else if (f->code == ARCHIVE_FILTER_LZMA) { ret = lzma_alone_encoder(&(data->stream), &data->lzma_opt); - else { /* ARCHIVE_FILTER_LZIP */ + } else { /* ARCHIVE_FILTER_LZIP */ int dict_size = data->lzma_opt.dict_size; int ds, log2dic, wedges; diff --git a/libarchive/archive_write_set_format_xar.c b/libarchive/archive_write_set_format_xar.c index 10bc2256b..c3fe7c1cd 100644 --- a/libarchive/archive_write_set_format_xar.c +++ b/libarchive/archive_write_set_format_xar.c @@ -114,7 +114,7 @@ enum sumalg { #define MAX_SUM_SIZE 20 #define MD5_NAME "md5" #define SHA1_NAME "sha1" - + enum enctype { NONE, GZIP, @@ -805,7 +805,7 @@ xmlwrite_string(struct archive_write *a, xmlTextWriterPtr writer, if (value == NULL) return (ARCHIVE_OK); - + r = xmlTextWriterStartElement(writer, BAD_CAST_CONST(key)); if (r < 0) { archive_set_error(&a->archive, @@ -1875,7 +1875,7 @@ file_cmp_node(const struct archive_rb_node *n1, return (strcmp(f1->basename.s, f2->basename.s)); } - + static int file_cmp_key(const struct archive_rb_node *n, const void *key) { @@ -2494,7 +2494,7 @@ file_init_hardlinks(struct xar *xar) static const struct archive_rb_tree_ops rb_ops = { file_hd_cmp_node, file_hd_cmp_key, }; - + __archive_rb_tree_init(&(xar->hardlink_rbtree), &rb_ops); } @@ -2855,6 +2855,9 @@ compression_init_encoder_xz(struct archive *a, lzma_filter *lzmafilters; lzma_options_lzma lzma_opt; int r; +#ifdef HAVE_LZMA_STREAM_ENCODER_MT + lzma_mt mt_options; +#endif if (lastrm->valid) compression_end(a, lastrm); @@ -2879,7 +2882,17 @@ compression_init_encoder_xz(struct archive *a, lzmafilters[1].id = LZMA_VLI_UNKNOWN;/* Terminate */ *strm = lzma_init_data; - r = lzma_stream_encoder(strm, lzmafilters, LZMA_CHECK_CRC64); +#ifdef HAVE_LZMA_STREAM_ENCODER_MT + if (lzma_cputhreads() > 1) { + bzero(&mt_options, sizeof(mt_options)); + mt_options.threads = lzma_cputhreads(); + mt_options.timeout = 300; + mt_options.filters = lzmafilters; + mt_options.check = LZMA_CHECK_CRC64; + r = lzma_stream_encoder_mt(strm, &mt_options); + } else +#endif + r = lzma_stream_encoder(strm, lzmafilters, LZMA_CHECK_CRC64); switch (r) { case LZMA_OK: lastrm->real_stream = strm; @@ -3178,4 +3191,3 @@ getalgname(enum sumalg sumalg) } #endif /* Support xar format */ -