提交 20710401 编写于 作者: T The8472

limit tidy parallelism by taking -j into account

上级 77d1185f
...@@ -782,6 +782,7 @@ fn run(self, builder: &Builder<'_>) { ...@@ -782,6 +782,7 @@ fn run(self, builder: &Builder<'_>) {
cmd.arg(&builder.src); cmd.arg(&builder.src);
cmd.arg(&builder.initial_cargo); cmd.arg(&builder.initial_cargo);
cmd.arg(&builder.out); cmd.arg(&builder.out);
cmd.arg(builder.jobs().to_string());
if builder.is_verbose() { if builder.is_verbose() {
cmd.arg("--verbose"); cmd.arg("--verbose");
} }
......
...@@ -6,10 +6,13 @@ ...@@ -6,10 +6,13 @@
use tidy::*; use tidy::*;
use crossbeam_utils::thread::scope; use crossbeam_utils::thread::{scope, ScopedJoinHandle};
use std::collections::VecDeque;
use std::env; use std::env;
use std::num::NonZeroUsize;
use std::path::PathBuf; use std::path::PathBuf;
use std::process; use std::process;
use std::str::FromStr;
use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::atomic::{AtomicBool, Ordering};
fn main() { fn main() {
...@@ -17,6 +20,9 @@ fn main() { ...@@ -17,6 +20,9 @@ fn main() {
let cargo: PathBuf = env::args_os().nth(2).expect("need path to cargo").into(); let cargo: PathBuf = env::args_os().nth(2).expect("need path to cargo").into();
let output_directory: PathBuf = let output_directory: PathBuf =
env::args_os().nth(3).expect("need path to output directory").into(); 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 src_path = root_path.join("src");
let library_path = root_path.join("library"); let library_path = root_path.join("library");
...@@ -29,15 +35,23 @@ fn main() { ...@@ -29,15 +35,23 @@ fn main() {
let bad = std::sync::Arc::new(AtomicBool::new(false)); let bad = std::sync::Arc::new(AtomicBool::new(false));
scope(|s| { scope(|s| {
let mut handles: VecDeque<ScopedJoinHandle<'_, ()>> =
VecDeque::with_capacity(concurrency.get());
macro_rules! check { macro_rules! check {
($p:ident $(, $args:expr)* ) => { ($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; let mut flag = false;
$p::check($($args),* , &mut flag); $p::check($($args),* , &mut flag);
if (flag) { if (flag) {
bad.store(true, Ordering::Relaxed); bad.store(true, Ordering::Relaxed);
} }
}); });
handles.push_back(handle);
} }
} }
...@@ -74,6 +88,9 @@ fn main() { ...@@ -74,6 +88,9 @@ fn main() {
check!(edition, &library_path); check!(edition, &library_path);
let collected = { let collected = {
while handles.len() >= concurrency.get() {
handles.pop_front().unwrap().join().unwrap();
}
let mut flag = false; let mut flag = false;
let r = features::check(&src_path, &compiler_path, &library_path, &mut flag, verbose); let r = features::check(&src_path, &compiler_path, &library_path, &mut flag, verbose);
if flag { if flag {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册