diff --git a/src/bootstrap/test.rs b/src/bootstrap/test.rs index c0cd24dd81f01f34e0628b3d16a79cfbd618d5bb..af4263d85c3efe63442628aae56c52135d497f41 100644 --- a/src/bootstrap/test.rs +++ b/src/bootstrap/test.rs @@ -782,6 +782,7 @@ fn run(self, builder: &Builder<'_>) { cmd.arg(&builder.src); cmd.arg(&builder.initial_cargo); cmd.arg(&builder.out); + cmd.arg(builder.jobs().to_string()); if builder.is_verbose() { cmd.arg("--verbose"); } diff --git a/src/tools/tidy/src/main.rs b/src/tools/tidy/src/main.rs index 9151d2bb4062a6bb810cbc088f4f63371f77e85a..2d19db38799f4b9962febaf34f1ca4ca9644acf7 100644 --- a/src/tools/tidy/src/main.rs +++ b/src/tools/tidy/src/main.rs @@ -6,10 +6,13 @@ use tidy::*; -use crossbeam_utils::thread::scope; +use crossbeam_utils::thread::{scope, ScopedJoinHandle}; +use std::collections::VecDeque; use std::env; +use std::num::NonZeroUsize; use std::path::PathBuf; use std::process; +use std::str::FromStr; use std::sync::atomic::{AtomicBool, Ordering}; fn main() { @@ -17,6 +20,9 @@ fn main() { let cargo: PathBuf = env::args_os().nth(2).expect("need path to cargo").into(); let output_directory: PathBuf = env::args_os().nth(3).expect("need path to output directory").into(); + let concurrency: NonZeroUsize = + FromStr::from_str(&env::args().nth(4).expect("need concurrency")) + .expect("concurrency must be a number"); let src_path = root_path.join("src"); let library_path = root_path.join("library"); @@ -29,15 +35,23 @@ fn main() { let bad = std::sync::Arc::new(AtomicBool::new(false)); scope(|s| { + let mut handles: VecDeque> = + VecDeque::with_capacity(concurrency.get()); + macro_rules! check { ($p:ident $(, $args:expr)* ) => { - s.spawn(|_| { + while handles.len() >= concurrency.get() { + handles.pop_front().unwrap().join().unwrap(); + } + + let handle = s.spawn(|_| { let mut flag = false; $p::check($($args),* , &mut flag); if (flag) { bad.store(true, Ordering::Relaxed); } }); + handles.push_back(handle); } } @@ -74,6 +88,9 @@ fn main() { check!(edition, &library_path); let collected = { + while handles.len() >= concurrency.get() { + handles.pop_front().unwrap().join().unwrap(); + } let mut flag = false; let r = features::check(&src_path, &compiler_path, &library_path, &mut flag, verbose); if flag {