]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
libarchive: use lzma_stream_encoder_mt() if it's available.
authorRui Paulo <rpaulo@felyko.com>
Mon, 9 Feb 2015 18:15:38 +0000 (10:15 -0800)
committerRui Paulo <rpaulo@felyko.com>
Mon, 9 Feb 2015 18:15:38 +0000 (10:15 -0800)
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.

configure.ac
libarchive/archive_write_add_filter_xz.c
libarchive/archive_write_set_format_xar.c

index 739cb0209e5b6707c4be3fb53d48a1cb5f61b8d6..92a9ff93a45e564eeb49f0432ded1fbbc626b8d1 100644 (file)
@@ -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
index fa73311e7ef42eb616113f1b7f5c2996fd0d662f..b6c76c6e31884d7cd92e86867a895b75fb69405f 100644 (file)
@@ -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;
 
index 10bc2256b4220097b7098e0448ea73d81c90a2a8..c3fe7c1cd3ad0d167b522fa8af196c43ce83fca7 100644 (file)
@@ -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 */
-