| // Copyright 2016 The Bazel Authors. All rights reserved. | |
| // | |
| // Licensed under the Apache License, Version 2.0 (the "License"); | |
| // you may not use this file except in compliance with the License. | |
| // You may obtain a copy of the License at | |
| // | |
| // http://www.apache.org/licenses/LICENSE-2.0 | |
| // | |
| // Unless required by applicable law or agreed to in writing, software | |
| // distributed under the License is distributed on an "AS IS" BASIS, | |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| // See the License for the specific language governing permissions and | |
| // limitations under the License. | |
| package com.google.devtools.build.lib.actions; | |
| import java.util.List; | |
| import java.util.concurrent.atomic.AtomicReference; | |
| /** | |
| * A context that allows execution of {@link Spawn} instances similar to {@link SpawnActionContext}, | |
| * but with the additional restriction, that during execution the {@link Spawn} must not be allowed | |
| * to modify the current execution root of the build. Instead, the {@link Spawn} should be executed | |
| * in a sandbox or on a remote system and its output files only be moved to the execution root, if | |
| * the implementation is able to {@code compareAndSet} the {@link AtomicReference} that is passed to | |
| * the {@link #exec} method to its own class object (e.g. LinuxSandboxedStrategy.class). | |
| * | |
| * <p>If the {@code compareAndSet} fails, the Spawn strategy should abandon the output of its | |
| * execution and throw an {@link InterruptedException} from its {@code exec} method. | |
| */ | |
| public interface SandboxedSpawnActionContext extends SpawnActionContext { | |
| /** | |
| * Executes the given spawn. | |
| * | |
| * <p>When the {@link SpawnActionContext} is about to move the output files of the spawn out of | |
| * the sandbox into the execroot, it has to first verify that the {@link AtomicReference} is still | |
| * null or already set to a value uniquely identifying the current {@link SpawnActionContext} | |
| * (e.g. the class object of the strategy). This is to ensure that in case multiple {@link | |
| * SandboxedSpawnActionContext} instances are processing the {@link Spawn} in parallel that only | |
| * one strategy actually generates the output files. | |
| * | |
| * <p>If the {@link AtomicReference} is not null (thus {@code #compareAndSet} fails) and not set | |
| * to the unique reference of the strategy, the {@link SandboxedSpawnActionContext} should abandon | |
| * all results and raise {@link InterruptedException}. | |
| * | |
| * @return a List of {@link SpawnResult}s containing metadata about the Spawn's execution. This | |
| * will typically contain one element, but could contain no elements if spawn execution did | |
| * not complete, or contain multiple elements if multiple sub-spawns were executed | |
| */ | |
| List<SpawnResult> exec( | |
| Spawn spawn, | |
| ActionExecutionContext actionExecutionContext, | |
| AtomicReference<Class<? extends SpawnActionContext>> writeOutputFiles) | |
| throws ExecException, InterruptedException; | |
| } |