From bde95700691cad1c508eb396e190a9d8638f024f Mon Sep 17 00:00:00 2001 From: The8472 Date: Tue, 8 Jun 2021 23:09:56 +0200 Subject: [PATCH] Lazify is_really_default condition in the RustdocGUI bootstrap step The `RustdocGUI::should_run` condition spawns `npm list` several times which adds up to seconds of wall-time. Evaluate the condition lazily to to keep `./x.py test tidy` and similar short-running tasks fast. --- Cargo.lock | 1 + src/bootstrap/Cargo.toml | 1 + src/bootstrap/builder.rs | 28 +++++++++++++++++++++++----- src/bootstrap/test.rs | 6 +++--- 4 files changed, 28 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2f06506eaa4..f476466235c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -179,6 +179,7 @@ dependencies = [ "libc", "merge", "num_cpus", + "once_cell", "opener", "pretty_assertions", "serde", diff --git a/src/bootstrap/Cargo.toml b/src/bootstrap/Cargo.toml index 8445d811e0f..d1e666936f8 100644 --- a/src/bootstrap/Cargo.toml +++ b/src/bootstrap/Cargo.toml @@ -50,6 +50,7 @@ time = "0.1" ignore = "0.4.10" opener = "0.4" merge = "0.1.0" +once_cell = "1.7.2" [target.'cfg(windows)'.dependencies.winapi] version = "0.3" diff --git a/src/bootstrap/builder.rs b/src/bootstrap/builder.rs index bc499fdba59..e2f605257bd 100644 --- a/src/bootstrap/builder.rs +++ b/src/bootstrap/builder.rs @@ -29,6 +29,8 @@ use crate::{Build, DocTests, GitRepo, Mode}; pub use crate::Compiler; +// FIXME: replace with std::lazy after it gets stabilized and reaches beta +use once_cell::sync::Lazy; pub struct Builder<'a> { pub build: &'a Build, @@ -195,7 +197,7 @@ fn run(v: &[StepDescription], builder: &Builder<'_>, paths: &[PathBuf]) { if paths.is_empty() || builder.config.include_default_paths { for (desc, should_run) in v.iter().zip(&should_runs) { - if desc.default && should_run.is_really_default { + if desc.default && should_run.is_really_default() { for pathset in &should_run.paths { desc.maybe_run(builder, pathset); } @@ -228,7 +230,11 @@ fn run(v: &[StepDescription], builder: &Builder<'_>, paths: &[PathBuf]) { } } -#[derive(Clone)] +enum ReallyDefault<'a> { + Bool(bool), + Lazy(Lazy bool + 'a>>), +} + pub struct ShouldRun<'a> { pub builder: &'a Builder<'a>, // use a BTreeSet to maintain sort order @@ -236,7 +242,7 @@ pub struct ShouldRun<'a> { // If this is a default rule, this is an additional constraint placed on // its run. Generally something like compiler docs being enabled. - is_really_default: bool, + is_really_default: ReallyDefault<'a>, } impl<'a> ShouldRun<'a> { @@ -244,15 +250,27 @@ fn new(builder: &'a Builder<'_>) -> ShouldRun<'a> { ShouldRun { builder, paths: BTreeSet::new(), - is_really_default: true, // by default no additional conditions + is_really_default: ReallyDefault::Bool(true), // by default no additional conditions } } pub fn default_condition(mut self, cond: bool) -> Self { - self.is_really_default = cond; + self.is_really_default = ReallyDefault::Bool(cond); + self + } + + pub fn lazy_default_condition(mut self, lazy_cond: Box bool + 'a>) -> Self { + self.is_really_default = ReallyDefault::Lazy(Lazy::new(lazy_cond)); self } + pub fn is_really_default(&self) -> bool { + match &self.is_really_default { + ReallyDefault::Bool(val) => *val, + ReallyDefault::Lazy(lazy) => *lazy.deref(), + } + } + /// Indicates it should run if the command-line selects the given crate or /// any of its (local) dependencies. /// diff --git a/src/bootstrap/test.rs b/src/bootstrap/test.rs index 0b7a0e25df1..319b56a0b70 100644 --- a/src/bootstrap/test.rs +++ b/src/bootstrap/test.rs @@ -806,15 +806,15 @@ impl Step for RustdocGUI { fn should_run(run: ShouldRun<'_>) -> ShouldRun<'_> { let builder = run.builder; let run = run.suite_path("src/test/rustdoc-gui"); - run.default_condition( + run.lazy_default_condition(Box::new(move || { builder.config.nodejs.is_some() && builder .config .npm .as_ref() .map(|p| check_if_browser_ui_test_is_installed(p)) - .unwrap_or(false), - ) + .unwrap_or(false) + })) } fn make_run(run: RunConfig<'_>) { -- 2.44.0