diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2022-12-17 23:44:29 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-12-17 23:44:29 +0100 |
| commit | cf08eda0b379cdce4983f6fa344059b6bc23a64d (patch) | |
| tree | dcbe3ef5efb96ac61b17fbfda083dd41e9250770 /src/bootstrap | |
| parent | eaf2f26ecc7338093fce4ec0013056d1fe6c720c (diff) | |
| parent | ab7d76965168f1104488549feaebd24ffa69b3b7 (diff) | |
| download | rust-cf08eda0b379cdce4983f6fa344059b6bc23a64d.tar.gz rust-cf08eda0b379cdce4983f6fa344059b6bc23a64d.zip | |
Rollup merge of #105829 - the8472:tidy-style, r=jyn514
Speed up tidy This can be reviewed commit by commit since they contain separate optimizations. ``` # master $ taskset -c 0-5 hyperfine './x test tidy' Benchmark #1: ./x test tidy Time (mean ± σ): 4.857 s ± 0.064 s [User: 12.967 s, System: 2.014 s] Range (min … max): 4.779 s … 4.997 s 10 runs # PR $ taskset -c 0-5 hyperfine './x test tidy' Benchmark #1: ./x test tidy Time (mean ± σ): 3.672 s ± 0.035 s [User: 10.524 s, System: 2.029 s] Range (min … max): 3.610 s … 3.725 s 10 runs ```
Diffstat (limited to 'src/bootstrap')
| -rw-r--r-- | src/bootstrap/format.rs | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/src/bootstrap/format.rs b/src/bootstrap/format.rs index 5e7264fe765..b2f6afead79 100644 --- a/src/bootstrap/format.rs +++ b/src/bootstrap/format.rs @@ -8,7 +8,7 @@ use std::path::{Path, PathBuf}; use std::process::{Command, Stdio}; use std::sync::mpsc::SyncSender; -fn rustfmt(src: &Path, rustfmt: &Path, paths: &[PathBuf], check: bool) -> impl FnMut() { +fn rustfmt(src: &Path, rustfmt: &Path, paths: &[PathBuf], check: bool) -> impl FnMut(bool) -> bool { let mut cmd = Command::new(&rustfmt); // avoid the submodule config paths from coming into play, // we only allow a single global config for the workspace for now @@ -23,7 +23,13 @@ fn rustfmt(src: &Path, rustfmt: &Path, paths: &[PathBuf], check: bool) -> impl F let cmd_debug = format!("{:?}", cmd); let mut cmd = cmd.spawn().expect("running rustfmt"); // poor man's async: return a closure that'll wait for rustfmt's completion - move || { + move |block: bool| -> bool { + if !block { + match cmd.try_wait() { + Ok(Some(_)) => {} + _ => return false, + } + } let status = cmd.wait().unwrap(); if !status.success() { eprintln!( @@ -34,6 +40,7 @@ fn rustfmt(src: &Path, rustfmt: &Path, paths: &[PathBuf], check: bool) -> impl F ); crate::detail_exit(1); } + true } } @@ -146,15 +153,23 @@ pub fn format(build: &Builder<'_>, check: bool, paths: &[PathBuf]) { let child = rustfmt(&src, &rustfmt_path, paths.as_slice(), check); children.push_back(child); + // poll completion before waiting + for i in (0..children.len()).rev() { + if children[i](false) { + children.swap_remove_back(i); + break; + } + } + if children.len() >= max_processes { // await oldest child - children.pop_front().unwrap()(); + children.pop_front().unwrap()(true); } } // await remaining children for mut child in children { - child(); + child(true); } }); |
