Browse Source

libdpkg: Add experimental multithreaded xz compressor support

This should speed up compression on multicore systems. This code has
only been build tested against latest xz-utils git tree, but not run
tested, as the package in Debian is too old. Rrquires xz >= 5.2.0.
Guillem Jover 8 years ago
parent
commit
673e967783
3 changed files with 24 additions and 1 deletions
  1. 2 0
      debian/changelog
  2. 19 1
      lib/dpkg/compress.c
  3. 3 0
      m4/dpkg-libs.m4

+ 2 - 0
debian/changelog

@@ -24,6 +24,8 @@ dpkg (1.18.4) UNRELEASED; urgency=medium
     Fixes CVE-2015-0860.
   * Fix an off-by-one read access in dpkg-deb when parsing ar member names.
     Thanks to Hanno Böck <hanno@hboeck.de>.
+  * Add experimental multithreaded xz compression support in libdpkg, which
+    requires xz >= 5.2.0.
   * Test suite:
     - Improve perl code test coverage.
   * Build system:

+ 19 - 1
lib/dpkg/compress.c

@@ -527,6 +527,17 @@ static void
 filter_xz_init(struct io_lzma *io, lzma_stream *s)
 {
 	uint32_t preset;
+	lzma_check check = LZMA_CHECK_CRC64;
+#ifdef HAVE_LZMA_MT
+	lzma_mt mt_options = {
+		.flags = 0,
+		.threads = sysconf(_SC_NPROCESSORS_ONLN),
+		.block_size = 0,
+		.timeout = 0,
+		.filters = NULL,
+		.check = check,
+	};
+#endif
 	lzma_ret ret;
 
 	io->status |= DPKG_STREAM_COMPRESS;
@@ -534,7 +545,14 @@ filter_xz_init(struct io_lzma *io, lzma_stream *s)
 	preset = io->params->level;
 	if (io->params->strategy == COMPRESSOR_STRATEGY_EXTREME)
 		preset |= LZMA_PRESET_EXTREME;
-	ret = lzma_easy_encoder(s, preset, LZMA_CHECK_CRC64);
+
+#ifdef HAVE_LZMA_MT
+	mt_options.preset = preset;
+	ret = lzma_stream_encoder_mt(s, &mt_options);
+#else
+	ret = lzma_easy_encoder(s, preset, check);
+#endif
+
 	if (ret != LZMA_OK)
 		filter_lzma_error(io, ret);
 }

+ 3 - 0
m4/dpkg-libs.m4

@@ -61,6 +61,9 @@ AC_DEFUN([DPKG_LIB_ZLIB], [
 # Check for lzma library.
 AC_DEFUN([DPKG_LIB_LZMA], [
   DPKG_WITH_COMPRESS_LIB([liblzma], [lzma.h], [lzma_alone_decoder], [lzma])
+  AC_CHECK_LIB([lzma], [lzma_stream_encoder_mt],
+               [AC_DEFINE([HAVE_LZMA_MT], [1],
+                          [xz multithreaded compression support])])
 ])# DPKG_LIB_LZMA
 
 # DPKG_LIB_BZ2