Просмотр исходного кода

libdpkg: Let backends decide default compression level

When compressing packages with gzip or bzip2, the tradeoff is
clear: a better compression ratio for a distributed package is
generally worth spending some extra time at build time. Since
better compressed packages are not much more inconvenient to
decompress at all, dpkg defaults to the maximum compression level
and developers rarely need to override that default.

On the other hand, LZ77-based decompressors use more memory at
decompression time for more tightly compressed packages, so the
maximum compression level of ‘9’ (which uses more than 32 MiB
of memory to decompress) can be too high.

With this patch, instead of defaulting to ‘9’, the compress_filter()
function sets the level to the backend default stored in the compressor
structure if the level is ‘-1’. All backends currently default to ‘9’
for now; no change in behavior is intended.

Based-on-patch-by: Jonathan Nieder <jrnieder@gmail.com>
Guillem Jover лет назад: 16
Родитель
Сommit
f291751922
2 измененных файлов с 6 добавлено и 1 удалено
  1. 5 1
      lib/dpkg/compress.c
  2. 1 0
      lib/dpkg/compress.h

+ 5 - 1
lib/dpkg/compress.c

@@ -90,6 +90,7 @@ compress_none(int fd_in, int fd_out, int compress_level, const char *desc)
 struct compressor compressor_none = {
 	.name = "none",
 	.extension = "",
+	.default_level = 0,
 	.compress = compress_none,
 	.decompress = decompress_none,
 };
@@ -201,6 +202,7 @@ compress_gzip(int fd_in, int fd_out, int compress_level, const char *desc)
 struct compressor compressor_gzip = {
 	.name = "gzip",
 	.extension = ".gz",
+	.default_level = 9,
 	.compress = compress_gzip,
 	.decompress = decompress_gzip,
 };
@@ -317,6 +319,7 @@ compress_bzip2(int fd_in, int fd_out, int compress_level, const char *desc)
 struct compressor compressor_bzip2 = {
 	.name = "bzip2",
 	.extension = ".bz2",
+	.default_level = 9,
 	.compress = compress_bzip2,
 	.decompress = decompress_bzip2,
 };
@@ -343,6 +346,7 @@ compress_lzma(int fd_in, int fd_out, int compress_level, const char *desc)
 struct compressor compressor_lzma = {
 	.name = "lzma",
 	.extension = ".lzma",
+	.default_level = 9,
 	.compress = compress_lzma,
 	.decompress = decompress_lzma,
 };
@@ -416,7 +420,7 @@ compress_filter(struct compressor *compressor, int fd_in, int fd_out,
 	va_end(al);
 
 	if (compress_level < 0)
-		compress_level = 9;
+		compress_level = compressor->default_level;
 	else if (compress_level == 0)
 		compressor = &compressor_none;
 

+ 1 - 0
lib/dpkg/compress.h

@@ -33,6 +33,7 @@ DPKG_BEGIN_DECLS
 struct compressor {
 	const char *name;
 	const char *extension;
+	int default_level;
 	void (*compress)(int fd_in, int fd_out, int level, const char *desc);
 	void (*decompress)(int fd_in, int fd_out, const char *desc);
 };