// 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 javax.annotation.Nullable;

/**
 * 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.
 */
public interface SandboxedSpawnActionContext extends SpawnActionContext {

  /** Lambda interface to stop other instances of the same spawn before writing outputs. */
  @FunctionalInterface
  interface StopConcurrentSpawns {
    /**
     * Stops other instances of the same spawn before writing outputs.
     *
     * <p>This should be called once by each of the concurrent spawns to ensure that the others are
     * stopped, thus preventing conflicts when writing to the output tree.
     */
    void stop() throws InterruptedException;
  }

  /**
   * Executes the given spawn.
   *
   * <p>When the {@link SpawnActionContext} is about to write output files into the execroot, it
   * first asks any other concurrent instances of this same spawn (handled by other spawn runners
   * when dynamic scheduling is enabled) to stop by invoking the {@code stopConcurrentSpawns}
   * lambda.
   *
   * @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,
      // TODO(jmmv): Inject an empty lambda instead of allowing this to be null. Need to find a way
      // to deal with non-null implying speculation in e.g. AbstractSpawnStrategy (if it matters).
      @Nullable StopConcurrentSpawns stopConcurrentSpawns)
      throws ExecException, InterruptedException;
}
