about summary refs log tree commit diff
diff options
context:
space:
mode:
authorThe8472 <git@infinite-source.de>2021-02-13 20:28:18 +0100
committerThe8472 <git@infinite-source.de>2021-03-01 19:47:43 +0100
commit207104010a5c60ac31d52a834f9d45094b927c48 (patch)
tree5c0586be6c89501bb315f56e751d3b8e9da6554d
parent77d1185f00699236c4caec6504d758644d747453 (diff)
downloadrust-207104010a5c60ac31d52a834f9d45094b927c48.tar.gz
rust-207104010a5c60ac31d52a834f9d45094b927c48.zip
limit tidy parallelism by taking -j into account
-rw-r--r--src/bootstrap/test.rs1
-rw-r--r--src/tools/tidy/src/main.rs21
2 files changed, 20 insertions, 2 deletions
diff --git a/src/bootstrap/test.rs b/src/bootstrap/test.rs
index c0cd24dd81f..af4263d85c3 100644
--- a/src/bootstrap/test.rs
+++ b/src/bootstrap/test.rs
@@ -782,6 +782,7 @@ impl Step for Tidy {
         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 9151d2bb406..2d19db38799 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<ScopedJoinHandle<'_, ()>> =
+            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 {