// 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;
}
