aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/standalone
diff options
context:
space:
mode:
authorGravatar ulfjack <ulfjack@google.com>2017-07-24 11:09:40 +0200
committerGravatar Jakob Buchgraber <buchgr@google.com>2017-07-24 13:18:53 +0200
commit19befaf4c8623bf9671e0d8d5f4e713cd8a2c7a1 (patch)
treec49cad1df02499e9809ec739be6efcde693131be /src/main/java/com/google/devtools/build/lib/standalone
parent4dfb271df9dcdf01413a216ad046d955669160b7 (diff)
Extract a common AbstractSpawnStrategy parent class
This removes a bunch of code duplication that I previously introduced. PiperOrigin-RevId: 162909430
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/standalone')
-rw-r--r--src/main/java/com/google/devtools/build/lib/standalone/StandaloneActionContextProvider.java29
-rw-r--r--src/main/java/com/google/devtools/build/lib/standalone/StandaloneSpawnStrategy.java143
2 files changed, 26 insertions, 146 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/standalone/StandaloneActionContextProvider.java b/src/main/java/com/google/devtools/build/lib/standalone/StandaloneActionContextProvider.java
index ba42ed9965..62b1a7ee3e 100644
--- a/src/main/java/com/google/devtools/build/lib/standalone/StandaloneActionContextProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/standalone/StandaloneActionContextProvider.java
@@ -24,14 +24,19 @@ import com.google.devtools.build.lib.actions.ResourceManager;
import com.google.devtools.build.lib.exec.ActionContextProvider;
import com.google.devtools.build.lib.exec.ExecutionOptions;
import com.google.devtools.build.lib.exec.FileWriteStrategy;
+import com.google.devtools.build.lib.exec.SpawnRunner;
import com.google.devtools.build.lib.exec.StandaloneTestStrategy;
import com.google.devtools.build.lib.exec.TestStrategy;
+import com.google.devtools.build.lib.exec.apple.XCodeLocalEnvProvider;
+import com.google.devtools.build.lib.exec.local.LocalEnvProvider;
import com.google.devtools.build.lib.exec.local.LocalExecutionOptions;
+import com.google.devtools.build.lib.exec.local.LocalSpawnRunner;
import com.google.devtools.build.lib.rules.cpp.IncludeScanningContext;
import com.google.devtools.build.lib.rules.cpp.SpawnGccStrategy;
import com.google.devtools.build.lib.rules.test.ExclusiveTestStrategy;
import com.google.devtools.build.lib.rules.test.TestActionContext;
import com.google.devtools.build.lib.runtime.CommandEnvironment;
+import com.google.devtools.build.lib.util.OS;
import com.google.devtools.build.lib.vfs.FileSystemUtils;
import com.google.devtools.build.lib.vfs.Path;
import java.io.IOException;
@@ -72,8 +77,6 @@ public class StandaloneActionContextProvider extends ActionContextProvider {
@Override
public Iterable<? extends ActionContext> getActionContexts() {
ExecutionOptions executionOptions = env.getOptions().getOptions(ExecutionOptions.class);
- LocalExecutionOptions localExecutionOptions =
- env.getOptions().getOptions(LocalExecutionOptions.class);
Path testTmpRoot =
TestStrategy.getTmpRoot(env.getWorkspace(), env.getExecRoot(), executionOptions);
@@ -86,16 +89,26 @@ public class StandaloneActionContextProvider extends ActionContextProvider {
// could potentially be used and a spawnActionContext doesn't specify which one it wants, the
// last one from strategies list will be used
return ImmutableList.of(
- new StandaloneSpawnStrategy(
- env.getExecRoot(),
- localExecutionOptions,
- executionOptions.verboseFailures,
- env.getRuntime().getProductName(),
- ResourceManager.instance()),
+ new StandaloneSpawnStrategy(executionOptions.verboseFailures, createLocalRunner(env)),
new DummyIncludeScanningContext(),
new SpawnGccStrategy(),
testStrategy,
new ExclusiveTestStrategy(testStrategy),
new FileWriteStrategy());
}
+
+ private static SpawnRunner createLocalRunner(CommandEnvironment env) {
+ LocalExecutionOptions localExecutionOptions =
+ env.getOptions().getOptions(LocalExecutionOptions.class);
+ LocalEnvProvider localEnvProvider = OS.getCurrent() == OS.DARWIN
+ ? new XCodeLocalEnvProvider()
+ : LocalEnvProvider.UNMODIFIED;
+ return
+ new LocalSpawnRunner(
+ env.getExecRoot(),
+ localExecutionOptions,
+ ResourceManager.instance(),
+ env.getRuntime().getProductName(),
+ localEnvProvider);
+ }
}
diff --git a/src/main/java/com/google/devtools/build/lib/standalone/StandaloneSpawnStrategy.java b/src/main/java/com/google/devtools/build/lib/standalone/StandaloneSpawnStrategy.java
index f62e2b7bdf..495d46d362 100644
--- a/src/main/java/com/google/devtools/build/lib/standalone/StandaloneSpawnStrategy.java
+++ b/src/main/java/com/google/devtools/build/lib/standalone/StandaloneSpawnStrategy.java
@@ -13,152 +13,19 @@
// limitations under the License.
package com.google.devtools.build.lib.standalone;
-import com.google.common.eventbus.EventBus;
-import com.google.devtools.build.lib.actions.ActionExecutionContext;
-import com.google.devtools.build.lib.actions.ActionInput;
-import com.google.devtools.build.lib.actions.ActionInputFileCache;
-import com.google.devtools.build.lib.actions.ActionStatusMessage;
-import com.google.devtools.build.lib.actions.Artifact.ArtifactExpander;
-import com.google.devtools.build.lib.actions.ExecException;
import com.google.devtools.build.lib.actions.ExecutionStrategy;
-import com.google.devtools.build.lib.actions.ResourceManager;
-import com.google.devtools.build.lib.actions.Spawn;
import com.google.devtools.build.lib.actions.SpawnActionContext;
-import com.google.devtools.build.lib.actions.Spawns;
-import com.google.devtools.build.lib.actions.UserExecException;
-import com.google.devtools.build.lib.exec.SpawnExecException;
-import com.google.devtools.build.lib.exec.SpawnInputExpander;
-import com.google.devtools.build.lib.exec.SpawnResult;
-import com.google.devtools.build.lib.exec.SpawnResult.Status;
-import com.google.devtools.build.lib.exec.SpawnRunner.ProgressStatus;
-import com.google.devtools.build.lib.exec.SpawnRunner.SpawnExecutionPolicy;
-import com.google.devtools.build.lib.exec.apple.XCodeLocalEnvProvider;
-import com.google.devtools.build.lib.exec.local.LocalEnvProvider;
-import com.google.devtools.build.lib.exec.local.LocalExecutionOptions;
-import com.google.devtools.build.lib.exec.local.LocalSpawnRunner;
-import com.google.devtools.build.lib.rules.fileset.FilesetActionContext;
-import com.google.devtools.build.lib.util.CommandFailureUtils;
-import com.google.devtools.build.lib.util.OS;
-import com.google.devtools.build.lib.util.io.FileOutErr;
-import com.google.devtools.build.lib.vfs.Path;
-import com.google.devtools.build.lib.vfs.PathFragment;
-import java.io.IOException;
-import java.util.SortedMap;
-import java.util.concurrent.atomic.AtomicInteger;
+import com.google.devtools.build.lib.exec.AbstractSpawnStrategy;
+import com.google.devtools.build.lib.exec.SpawnRunner;
/**
* Strategy that uses subprocessing to execute a process.
*/
@ExecutionStrategy(name = { "standalone", "local" }, contextType = SpawnActionContext.class)
-public class StandaloneSpawnStrategy implements SpawnActionContext {
- private final boolean verboseFailures;
- private final LocalSpawnRunner localSpawnRunner;
- private final AtomicInteger execCount = new AtomicInteger();
-
+public class StandaloneSpawnStrategy extends AbstractSpawnStrategy {
public StandaloneSpawnStrategy(
- Path execRoot, LocalExecutionOptions localExecutionOptions, boolean verboseFailures,
- String productName, ResourceManager resourceManager) {
- this.verboseFailures = verboseFailures;
- LocalEnvProvider localEnvProvider = OS.getCurrent() == OS.DARWIN
- ? new XCodeLocalEnvProvider()
- : LocalEnvProvider.UNMODIFIED;
- this.localSpawnRunner = new LocalSpawnRunner(
- execRoot,
- localExecutionOptions,
- resourceManager,
- productName,
- localEnvProvider);
- }
-
- /**
- * Executes the given {@code spawn}.
- */
- @Override
- public void exec(final Spawn spawn, final ActionExecutionContext actionExecutionContext)
- throws ExecException, InterruptedException {
- final int timeoutSeconds = Spawns.getTimeoutSeconds(spawn);
- final EventBus eventBus = actionExecutionContext.getEventBus();
- SpawnExecutionPolicy policy = new SpawnExecutionPolicy() {
- private final int id = execCount.incrementAndGet();
-
- @Override
- public int getId() {
- return id;
- }
-
- @Override
- public void prefetchInputs(Iterable<ActionInput> inputs) throws IOException {
- if (Spawns.shouldPrefetchInputsForLocalExecution(spawn)) {
- actionExecutionContext.getActionInputPrefetcher().prefetchFiles(inputs);
- }
- }
-
- @Override
- public ActionInputFileCache getActionInputFileCache() {
- return actionExecutionContext.getActionInputFileCache();
- }
-
- @Override
- public ArtifactExpander getArtifactExpander() {
- return actionExecutionContext.getArtifactExpander();
- }
-
- @Override
- public void lockOutputFiles() throws InterruptedException {
- // Do nothing for now.
- }
-
- @Override
- public long getTimeoutMillis() {
- return timeoutSeconds * 1000L;
- }
-
- @Override
- public FileOutErr getFileOutErr() {
- return actionExecutionContext.getFileOutErr();
- }
-
- @Override
- public SortedMap<PathFragment, ActionInput> getInputMapping() throws IOException {
- return new SpawnInputExpander(/*strict*/false)
- .getInputMapping(
- spawn,
- actionExecutionContext.getArtifactExpander(),
- actionExecutionContext.getActionInputFileCache(),
- actionExecutionContext.getContext(FilesetActionContext.class));
- }
-
- @Override
- public void report(ProgressStatus state, String name) {
- switch (state) {
- case EXECUTING:
- eventBus.post(ActionStatusMessage.runningStrategy(spawn.getResourceOwner(), name));
- break;
- case SCHEDULING:
- eventBus.post(ActionStatusMessage.schedulingStrategy(spawn.getResourceOwner()));
- break;
- default:
- break;
- }
- }
- };
-
- if (actionExecutionContext.reportsSubcommands()) {
- actionExecutionContext.reportSubcommand(spawn);
- }
-
- try {
- SpawnResult result = localSpawnRunner.exec(spawn, policy);
- if (result.status() != Status.SUCCESS || result.exitCode() != 0) {
- String message =
- CommandFailureUtils.describeCommandFailure(
- verboseFailures, spawn.getArguments(), spawn.getEnvironment(), null);
- throw new SpawnExecException(
- message, result, /*forciblyRunRemotely=*/false, /*catastrophe=*/false);
- }
- } catch (IOException e) {
- throw new UserExecException("I/O exception during local execution", e);
- }
+ boolean verboseFailures, SpawnRunner spawnRunner) {
+ super(verboseFailures, spawnRunner);
}
@Override