Refactor out-err teeing Move collection of output listeners to CommandEnvironment, in preparation for moving it earlier in the startup sequence and removing the BlazeModule.getOutputListener method. This might also be slightly more efficient. PiperOrigin-RevId: 215207392
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/BlazeCommandDispatcher.java b/src/main/java/com/google/devtools/build/lib/runtime/BlazeCommandDispatcher.java index 9bc6c4a..8b4015c 100644 --- a/src/main/java/com/google/devtools/build/lib/runtime/BlazeCommandDispatcher.java +++ b/src/main/java/com/google/devtools/build/lib/runtime/BlazeCommandDispatcher.java
@@ -299,16 +299,8 @@ } env.getReporter().removeHandler(storedEventHandler); - // We may only start writing to outErr once we've given the modules the chance to hook in. - for (BlazeModule module : runtime.getBlazeModules()) { - try (SilentCloseable closeable = - Profiler.instance().profile(module + ".getOutputListener")) { - OutErr listener = module.getOutputListener(); - if (listener != null) { - outErr = tee(outErr, listener); - } - } - } + // Setup stdout / stderr. + outErr = tee(outErr, env.getOutputListeners()); // Early exit. We need to guarantee that the ErrOut and Reporter setup below never error out, // so any invariants they need must be checked before this point. @@ -564,11 +556,16 @@ } - private OutErr tee(OutErr outErr1, OutErr outErr2) { - DelegatingOutErr outErr = new DelegatingOutErr(); - outErr.addSink(outErr1); - outErr.addSink(outErr2); - return outErr; + private OutErr tee(OutErr outErr, List<OutErr> additionalOutErrs) { + if (additionalOutErrs.isEmpty()) { + return outErr; + } + DelegatingOutErr result = new DelegatingOutErr(); + result.addSink(outErr); + for (OutErr additionalOutErr : additionalOutErrs) { + result.addSink(additionalOutErr); + } + return result; } private void closeSilently(OutputStream logOutputStream) {
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/CommandEnvironment.java b/src/main/java/com/google/devtools/build/lib/runtime/CommandEnvironment.java index a5e948b..f90d75d 100644 --- a/src/main/java/com/google/devtools/build/lib/runtime/CommandEnvironment.java +++ b/src/main/java/com/google/devtools/build/lib/runtime/CommandEnvironment.java
@@ -40,6 +40,7 @@ import com.google.devtools.build.lib.skyframe.SkyframeExecutor; import com.google.devtools.build.lib.util.AbruptExitException; import com.google.devtools.build.lib.util.ExitCode; +import com.google.devtools.build.lib.util.io.OutErr; import com.google.devtools.build.lib.util.io.TimestampGranularityMonitor; import com.google.devtools.build.lib.vfs.FileSystemUtils; import com.google.devtools.build.lib.vfs.OutputService; @@ -48,6 +49,7 @@ import com.google.devtools.common.options.OptionsParsingResult; import com.google.devtools.common.options.OptionsProvider; import java.io.IOException; +import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; @@ -319,6 +321,17 @@ return relativeWorkingDirectory; } + List<OutErr> getOutputListeners() { + List<OutErr> result = new ArrayList<>(); + for (BlazeModule module : runtime.getBlazeModules()) { + OutErr listener = module.getOutputListener(); + if (listener != null) { + result.add(listener); + } + } + return result; + } + /** * Creates and returns a new target pattern preloader. */