Skip to content

Commit 2636efd

Browse files
authored
Actually use the value of --threads in compressors (#893)
1 parent 316b08a commit 2636efd

File tree

4 files changed

+38
-4
lines changed

4 files changed

+38
-4
lines changed

src/cli/mod.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use fs_err as fs;
1313
pub use self::args::{CliArgs, Subcommand};
1414
use crate::{
1515
accessible::set_accessible,
16-
utils::{is_path_stdin, logger::set_log_display_level, FileVisibilityPolicy},
16+
utils::{is_path_stdin, logger::set_log_display_level, threads::set_thread_count, FileVisibilityPolicy},
1717
QuestionPolicy,
1818
};
1919

@@ -29,6 +29,11 @@ impl CliArgs {
2929
set_accessible(args.accessible);
3030
set_log_display_level(args.quiet);
3131

32+
match args.threads {
33+
Some(0) | None => {}
34+
Some(threads) => set_thread_count(threads),
35+
}
36+
3237
let (Subcommand::Compress { files, .. }
3338
| Subcommand::Decompress { files, .. }
3439
| Subcommand::List { archives: files, .. }) = &mut args.cmd;

src/commands/compress.rs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,11 @@ use crate::{
1212
archive,
1313
commands::warn_user_about_loading_zip_in_memory,
1414
extension::{split_first_compression_format, CompressionFormat::*, Extension},
15-
utils::{io::lock_and_flush_output_stdio, user_wants_to_continue, FileVisibilityPolicy},
15+
utils::{
16+
io::lock_and_flush_output_stdio,
17+
threads::{logical_thread_count, physical_thread_count},
18+
user_wants_to_continue, FileVisibilityPolicy,
19+
},
1620
QuestionAction, QuestionPolicy, BUFFER_CAPACITY,
1721
};
1822

@@ -52,6 +56,8 @@ pub fn compress_files(
5256
.compression_level(
5357
level.map_or_else(Default::default, |l| gzp::Compression::new((l as u32).clamp(0, 9))),
5458
)
59+
.num_threads(logical_thread_count())
60+
.expect("gpz: num_threads must be greater than 0")
5561
.from_writer(encoder);
5662
parz
5763
}),
@@ -84,7 +90,7 @@ pub fn compress_files(
8490
let dict_size = options.lzma_options.dict_size as u64;
8591
options.set_block_size(NonZeroU64::new(dict_size));
8692
// Use up to 256 PHYSICAL cores for compression
87-
let writer = lzma_rust2::XzWriterMt::new(encoder, options, num_cpus::get_physical() as u32)?;
93+
let writer = lzma_rust2::XzWriterMt::new(encoder, options, physical_thread_count() as u32)?;
8894
Box::new(writer.auto_finish())
8995
}
9096
Lzip => {
@@ -99,6 +105,8 @@ pub fn compress_files(
99105
.compression_level(gzp::par::compress::Compression::new(
100106
level.map_or_else(Default::default, |l| (l as u32).clamp(0, 9)),
101107
))
108+
.num_threads(logical_thread_count())
109+
.expect("gpz: num_threads must be greater than 0")
102110
.from_writer(encoder);
103111

104112
parz
@@ -111,7 +119,7 @@ pub fn compress_files(
111119
}),
112120
)?;
113121
// Use all available PHYSICAL cores for compression
114-
zstd_encoder.multithread(num_cpus::get_physical() as u32)?;
122+
zstd_encoder.multithread(physical_thread_count() as u32)?;
115123
Box::new(zstd_encoder.auto_finish())
116124
}
117125
Brotli => {

src/utils/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ mod fs;
1010
pub mod io;
1111
pub mod logger;
1212
mod question;
13+
pub mod threads;
1314

1415
pub use self::{
1516
file_visibility::FileVisibilityPolicy,

src/utils/threads.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
use std::sync::OnceLock;
2+
3+
static USER_DEFINED_THREAD_COUNT: OnceLock<usize> = OnceLock::new();
4+
5+
pub fn logical_thread_count() -> usize {
6+
USER_DEFINED_THREAD_COUNT.get().copied().unwrap_or(num_cpus::get())
7+
}
8+
9+
pub fn physical_thread_count() -> usize {
10+
USER_DEFINED_THREAD_COUNT
11+
.get()
12+
.copied()
13+
.unwrap_or(num_cpus::get_physical())
14+
}
15+
16+
pub fn set_thread_count(value: usize) {
17+
if USER_DEFINED_THREAD_COUNT.get().is_none() {
18+
USER_DEFINED_THREAD_COUNT.set(value).unwrap();
19+
}
20+
}

0 commit comments

Comments
 (0)