xz: Add support --threads=+N so that -T+1 gives threaded mode.
This commit is contained in:
parent
a11a2b8b5e
commit
d327743bb5
|
@ -258,11 +258,23 @@ parse_real(args_info *args, int argc, char **argv)
|
||||||
suffix_set(optarg);
|
suffix_set(optarg);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'T':
|
case 'T': {
|
||||||
|
// Since xz 5.4.0: Ignore leading '+' first.
|
||||||
|
const char *s = optarg;
|
||||||
|
if (optarg[0] == '+')
|
||||||
|
++s;
|
||||||
|
|
||||||
// The max is from src/liblzma/common/common.h.
|
// The max is from src/liblzma/common/common.h.
|
||||||
hardware_threads_set(str_to_uint64("threads",
|
uint32_t t = str_to_uint64("threads", s, 0, 16384);
|
||||||
optarg, 0, 16384));
|
|
||||||
|
// If leading '+' was used then use multi-threaded
|
||||||
|
// mode even if exactly one thread was specified.
|
||||||
|
if (t == 1 && optarg[0] == '+')
|
||||||
|
t = UINT32_MAX;
|
||||||
|
|
||||||
|
hardware_threads_set(t);
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
// --version
|
// --version
|
||||||
case 'V':
|
case 'V':
|
||||||
|
|
|
@ -21,6 +21,10 @@ static uint32_t threads_max = 1;
|
||||||
/// on the available hardware threads.
|
/// on the available hardware threads.
|
||||||
static bool threads_are_automatic = false;
|
static bool threads_are_automatic = false;
|
||||||
|
|
||||||
|
/// If true, then try to use multi-threaded mode (if memlimit allows)
|
||||||
|
/// even if only one thread was requested explicitly (-T+1).
|
||||||
|
static bool use_mt_mode_with_one_thread = false;
|
||||||
|
|
||||||
/// Memory usage limit for compression
|
/// Memory usage limit for compression
|
||||||
static uint64_t memlimit_compress = 0;
|
static uint64_t memlimit_compress = 0;
|
||||||
|
|
||||||
|
@ -57,9 +61,16 @@ static uint64_t total_ram;
|
||||||
extern void
|
extern void
|
||||||
hardware_threads_set(uint32_t n)
|
hardware_threads_set(uint32_t n)
|
||||||
{
|
{
|
||||||
|
// Reset these to false first and set them to true when appropriate.
|
||||||
|
threads_are_automatic = false;
|
||||||
|
use_mt_mode_with_one_thread = false;
|
||||||
|
|
||||||
if (n == 0) {
|
if (n == 0) {
|
||||||
// Automatic number of threads was requested.
|
// Automatic number of threads was requested.
|
||||||
|
// If there is only one hardware thread, multi-threaded
|
||||||
|
// mode will still be used if memory limit allows.
|
||||||
threads_are_automatic = true;
|
threads_are_automatic = true;
|
||||||
|
use_mt_mode_with_one_thread = true;
|
||||||
|
|
||||||
// If threading support was enabled at build time,
|
// If threading support was enabled at build time,
|
||||||
// use the number of available CPU cores. Otherwise
|
// use the number of available CPU cores. Otherwise
|
||||||
|
@ -72,9 +83,11 @@ hardware_threads_set(uint32_t n)
|
||||||
#else
|
#else
|
||||||
threads_max = 1;
|
threads_max = 1;
|
||||||
#endif
|
#endif
|
||||||
|
} else if (n == UINT32_MAX) {
|
||||||
|
use_mt_mode_with_one_thread = true;
|
||||||
|
threads_max = 1;
|
||||||
} else {
|
} else {
|
||||||
threads_max = n;
|
threads_max = n;
|
||||||
threads_are_automatic = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
@ -92,7 +105,7 @@ extern bool
|
||||||
hardware_threads_is_mt(void)
|
hardware_threads_is_mt(void)
|
||||||
{
|
{
|
||||||
#ifdef MYTHREAD_ENABLED
|
#ifdef MYTHREAD_ENABLED
|
||||||
return threads_max > 1 || threads_are_automatic;
|
return threads_max > 1 || use_mt_mode_with_one_thread;
|
||||||
#else
|
#else
|
||||||
return false;
|
return false;
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -16,6 +16,7 @@ extern void hardware_init(void);
|
||||||
|
|
||||||
|
|
||||||
/// Set the maximum number of worker threads.
|
/// Set the maximum number of worker threads.
|
||||||
|
/// A special value of UINT32_MAX sets one thread in multi-threaded mode.
|
||||||
extern void hardware_threads_set(uint32_t threadlimit);
|
extern void hardware_threads_set(uint32_t threadlimit);
|
||||||
|
|
||||||
/// Get the maximum number of worker threads.
|
/// Get the maximum number of worker threads.
|
||||||
|
|
21
src/xz/xz.1
21
src/xz/xz.1
|
@ -5,7 +5,7 @@
|
||||||
.\" This file has been put into the public domain.
|
.\" This file has been put into the public domain.
|
||||||
.\" You can do whatever you want with this file.
|
.\" You can do whatever you want with this file.
|
||||||
.\"
|
.\"
|
||||||
.TH XZ 1 "2022-11-09" "Tukaani" "XZ Utils"
|
.TH XZ 1 "2022-11-19" "Tukaani" "XZ Utils"
|
||||||
.
|
.
|
||||||
.SH NAME
|
.SH NAME
|
||||||
xz, unxz, xzcat, lzma, unlzma, lzcat \- Compress or decompress .xz and .lzma files
|
xz, unxz, xzcat, lzma, unlzma, lzcat \- Compress or decompress .xz and .lzma files
|
||||||
|
@ -1214,6 +1214,25 @@ even if the system supports only one hardware thread.
|
||||||
5.2.x
|
5.2.x
|
||||||
used single-threaded mode in this situation.)
|
used single-threaded mode in this situation.)
|
||||||
.IP ""
|
.IP ""
|
||||||
|
To use multi-threaded mode with only one thread, set
|
||||||
|
.I threads
|
||||||
|
to
|
||||||
|
.BR +1 .
|
||||||
|
The
|
||||||
|
.B +
|
||||||
|
prefix has no effect with values other than
|
||||||
|
.BR 1 .
|
||||||
|
A memory usage limit can still make
|
||||||
|
.B xz
|
||||||
|
switch to single-threaded mode unless
|
||||||
|
.B \-\-no\-adjust
|
||||||
|
is used.
|
||||||
|
Support for the
|
||||||
|
.B +
|
||||||
|
prefix was added in
|
||||||
|
.B xz
|
||||||
|
5.4.0.
|
||||||
|
.IP ""
|
||||||
If an automatic number of threads has been requested and
|
If an automatic number of threads has been requested and
|
||||||
no memory usage limit has been specified,
|
no memory usage limit has been specified,
|
||||||
then a system-specific default soft limit will be used to possibly
|
then a system-specific default soft limit will be used to possibly
|
||||||
|
|
Loading…
Reference in New Issue