Allow modules to register a SkyKeyStateReceiver to observe the start of each SkyKey evaluation, when a SkyKey is evaluated, and the start/end of work on another (non-Skyframe) thread that "belongs" to that SkyKey, like non-Skyframe globbing within PackageFunction.
PiperOrigin-RevId: 382812462
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/AspectValueKey.java b/src/main/java/com/google/devtools/build/lib/skyframe/AspectValueKey.java
index fddca3f..f97e08d 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/AspectValueKey.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/AspectValueKey.java
@@ -85,16 +85,35 @@
.build());
}
+ /** Common superclass for {@link AspectKey} and {@link TopLevelAspectsKey}. */
+ public abstract static class AspectBaseKey implements ActionLookupKey {
+ private final ConfiguredTargetKey baseConfiguredTargetKey;
+ private final int hashCode;
+
+ private AspectBaseKey(ConfiguredTargetKey baseConfiguredTargetKey, int hashCode) {
+ this.baseConfiguredTargetKey = baseConfiguredTargetKey;
+ this.hashCode = hashCode;
+ }
+
+ /** Returns the key for the base configured target for this aspect. */
+ public final ConfiguredTargetKey getBaseConfiguredTargetKey() {
+ return baseConfiguredTargetKey;
+ }
+
+ @Override
+ public final int hashCode() {
+ return hashCode;
+ }
+ }
+
// Specific subtypes of aspect keys.
/** Represents an aspect applied to a particular target. */
@AutoCodec
- public static final class AspectKey implements ActionLookupKey {
- private final ConfiguredTargetKey baseConfiguredTargetKey;
+ public static final class AspectKey extends AspectBaseKey {
private final ImmutableList<AspectKey> baseKeys;
@Nullable private final BuildConfigurationValue.Key aspectConfigurationKey;
private final AspectDescriptor aspectDescriptor;
- private final int hashCode;
private AspectKey(
ConfiguredTargetKey baseConfiguredTargetKey,
@@ -102,11 +121,10 @@
AspectDescriptor aspectDescriptor,
@Nullable BuildConfigurationValue.Key aspectConfigurationKey,
int hashCode) {
+ super(baseConfiguredTargetKey, hashCode);
this.baseKeys = baseKeys;
this.aspectConfigurationKey = aspectConfigurationKey;
- this.baseConfiguredTargetKey = baseConfiguredTargetKey;
this.aspectDescriptor = aspectDescriptor;
- this.hashCode = hashCode;
}
@AutoCodec.VisibleForSerialization
@@ -143,7 +161,7 @@
@Override
public Label getLabel() {
- return baseConfiguredTargetKey.getLabel();
+ return getBaseConfiguredTargetKey().getLabel();
}
public AspectClass getAspectClass() {
@@ -204,16 +222,6 @@
return aspectConfigurationKey;
}
- /** Returns the key for the base configured target for this aspect. */
- public ConfiguredTargetKey getBaseConfiguredTargetKey() {
- return baseConfiguredTargetKey;
- }
-
- @Override
- public int hashCode() {
- return hashCode;
- }
-
@Override
public boolean equals(Object other) {
if (this == other) {
@@ -223,10 +231,10 @@
return false;
}
AspectKey that = (AspectKey) other;
- return hashCode == that.hashCode
+ return hashCode() == that.hashCode()
&& Objects.equal(baseKeys, that.baseKeys)
&& Objects.equal(aspectConfigurationKey, that.aspectConfigurationKey)
- && Objects.equal(baseConfiguredTargetKey, that.baseConfiguredTargetKey)
+ && Objects.equal(getBaseConfiguredTargetKey(), that.getBaseConfiguredTargetKey())
&& Objects.equal(aspectDescriptor, that.aspectDescriptor);
}
@@ -249,7 +257,7 @@
+ " "
+ aspectConfigurationKey
+ " "
- + baseConfiguredTargetKey
+ + getBaseConfiguredTargetKey()
+ " "
+ aspectDescriptor.getParameters();
}
@@ -263,7 +271,7 @@
return createAspectKey(
ConfiguredTargetKey.builder()
.setLabel(label)
- .setConfigurationKey(baseConfiguredTargetKey.getConfigurationKey())
+ .setConfigurationKey(getBaseConfiguredTargetKey().getConfigurationKey())
.build(),
newBaseKeys.build(),
aspectDescriptor,
@@ -273,11 +281,9 @@
/** The key for top level aspects specified by --aspects option on a top level target. */
@AutoCodec
- public static final class TopLevelAspectsKey implements ActionLookupKey {
+ public static final class TopLevelAspectsKey extends AspectBaseKey {
private final ImmutableList<AspectClass> topLevelAspectsClasses;
private final Label targetLabel;
- private final ConfiguredTargetKey baseConfiguredTargetKey;
- private final int hashCode;
@AutoCodec.Instantiator
@AutoCodec.VisibleForSerialization
@@ -298,10 +304,9 @@
Label targetLabel,
ConfiguredTargetKey baseConfiguredTargetKey,
int hashCode) {
+ super(baseConfiguredTargetKey, hashCode);
this.topLevelAspectsClasses = topLevelAspectsClasses;
this.targetLabel = targetLabel;
- this.baseConfiguredTargetKey = baseConfiguredTargetKey;
- this.hashCode = hashCode;
}
@Override
@@ -318,20 +323,11 @@
return targetLabel;
}
- ConfiguredTargetKey getBaseConfiguredTargetKey() {
- return baseConfiguredTargetKey;
- }
-
String getDescription() {
return topLevelAspectsClasses + " on " + getLabel();
}
@Override
- public int hashCode() {
- return hashCode;
- }
-
- @Override
public boolean equals(Object o) {
if (o == this) {
return true;
@@ -340,9 +336,9 @@
return false;
}
TopLevelAspectsKey that = (TopLevelAspectsKey) o;
- return hashCode == that.hashCode
+ return hashCode() == that.hashCode()
&& Objects.equal(targetLabel, that.targetLabel)
- && Objects.equal(baseConfiguredTargetKey, that.baseConfiguredTargetKey)
+ && Objects.equal(getBaseConfiguredTargetKey(), that.getBaseConfiguredTargetKey())
&& Objects.equal(topLevelAspectsClasses, that.topLevelAspectsClasses);
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BUILD b/src/main/java/com/google/devtools/build/lib/skyframe/BUILD
index 8b1be8a..7ec0aed 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/BUILD
@@ -229,6 +229,7 @@
"//src/main/java/com/google/devtools/build/lib/actions:file_metadata",
"//src/main/java/com/google/devtools/build/lib/actions:fileset_output_symlink",
"//src/main/java/com/google/devtools/build/lib/actions:package_roots",
+ "//src/main/java/com/google/devtools/build/lib/actions:thread_state_receiver",
"//src/main/java/com/google/devtools/build/lib/actionsketch:action_sketch",
"//src/main/java/com/google/devtools/build/lib/analysis:actions/parameter_file_write_action",
"//src/main/java/com/google/devtools/build/lib/analysis:analysis_cluster",
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetKey.java b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetKey.java
index fa646b7..c137ae0 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetKey.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetKey.java
@@ -83,7 +83,7 @@
}
@Nullable
- ToolchainContextKey getToolchainContextKey() {
+ public ToolchainContextKey getToolchainContextKey() {
return null;
}
@@ -166,7 +166,7 @@
}
@Override
- final ToolchainContextKey getToolchainContextKey() {
+ public final ToolchainContextKey getToolchainContextKey() {
return toolchainContextKey;
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java
index e779a4d..63a2da6 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java
@@ -28,6 +28,7 @@
import com.google.common.collect.Sets;
import com.google.common.flogger.GoogleLogger;
import com.google.devtools.build.lib.actions.FileValue;
+import com.google.devtools.build.lib.actions.ThreadStateReceiver;
import com.google.devtools.build.lib.clock.BlazeClock;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.cmdline.LabelConstants;
@@ -89,6 +90,7 @@
import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.Function;
import javax.annotation.Nullable;
import net.starlark.java.eval.EvalException;
import net.starlark.java.eval.Module;
@@ -119,6 +121,8 @@
private final IncrementalityIntent incrementalityIntent;
+ private final Function<SkyKey, ThreadStateReceiver> threadStateReceiverFactoryForMetrics;
+
/**
* CompiledBuildFile holds information extracted from the BUILD syntax tree before it was
* discarded, such as the compiled program, its glob literals, and its mapping from each function
@@ -178,7 +182,8 @@
@Nullable BzlLoadFunction bzlLoadFunctionForInlining,
@Nullable PackageProgressReceiver packageProgress,
ActionOnIOExceptionReadingBuildFile actionOnIOExceptionReadingBuildFile,
- IncrementalityIntent incrementalityIntent) {
+ IncrementalityIntent incrementalityIntent,
+ Function<SkyKey, ThreadStateReceiver> threadStateReceiverFactoryForMetrics) {
this.bzlLoadFunctionForInlining = bzlLoadFunctionForInlining;
this.packageFactory = packageFactory;
this.packageLocator = pkgLocator;
@@ -189,6 +194,7 @@
this.packageProgress = packageProgress;
this.actionOnIOExceptionReadingBuildFile = actionOnIOExceptionReadingBuildFile;
this.incrementalityIntent = incrementalityIntent;
+ this.threadStateReceiverFactoryForMetrics = threadStateReceiverFactoryForMetrics;
}
public void setBzlLoadFunctionForInliningForTesting(BzlLoadFunction bzlLoadFunctionForInlining) {
@@ -526,7 +532,8 @@
starlarkBuiltinsValue,
preludeLabel,
packageLookupValue.getRoot(),
- env);
+ env,
+ key);
if (packageCacheEntry == null) {
return null; // skyframe restart
}
@@ -1201,13 +1208,15 @@
PackageIdentifier packageId,
ImmutableSet<PathFragment> repositoryIgnoredPatterns,
Root packageRoot,
- SkyFunction.Environment env) {
+ Environment env,
+ SkyKey keyForMetrics) {
NonSkyframeGlobber nonSkyframeGlobber =
packageFactory.createNonSkyframeGlobber(
buildFilePath.getParentDirectory(),
packageId,
repositoryIgnoredPatterns,
- packageLocator);
+ packageLocator,
+ threadStateReceiverFactoryForMetrics.apply(keyForMetrics));
switch (incrementalityIntent) {
case INCREMENTAL:
return new SkyframeHybridGlobber(packageId, packageRoot, env, nonSkyframeGlobber);
@@ -1240,7 +1249,8 @@
StarlarkBuiltinsValue starlarkBuiltinsValue,
@Nullable Label preludeLabel,
Root packageRoot,
- Environment env)
+ Environment env,
+ SkyKey keyForMetrics)
throws InterruptedException, PackageFunctionException {
// TODO(adonovan): opt: evaluate splitting this part out as a separate Skyframe
@@ -1347,7 +1357,12 @@
if (compiled.ok()) {
GlobberWithSkyframeGlobDeps globber =
makeGlobber(
- buildFilePath.asPath(), packageId, repositoryIgnoredPatterns, packageRoot, env);
+ buildFilePath.asPath(),
+ packageId,
+ repositoryIgnoredPatterns,
+ packageRoot,
+ env,
+ keyForMetrics);
pkgBuilder.setGeneratorMap(compiled.generatorMap);
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java
index ffcf87e..c9df897 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java
@@ -174,6 +174,7 @@
ExternalPackageHelper externalPackageHelper,
ActionOnIOExceptionReadingBuildFile actionOnIOExceptionReadingBuildFile,
@Nullable ManagedDirectoriesKnowledge managedDirectoriesKnowledge,
+ SkyKeyStateReceiver skyKeyStateReceiver,
BugReporter bugReporter) {
super(
skyframeExecutorConsumerOnInit,
@@ -195,6 +196,7 @@
new PackageProgressReceiver(),
new ConfiguredTargetProgressReceiver(),
managedDirectoriesKnowledge,
+ skyKeyStateReceiver,
bugReporter);
this.diffAwarenessManager = new DiffAwarenessManager(diffAwarenessFactories);
this.customDirtinessCheckers = customDirtinessCheckers;
@@ -1048,6 +1050,7 @@
private Consumer<SkyframeExecutor> skyframeExecutorConsumerOnInit = skyframeExecutor -> {};
private SkyFunction ignoredPackagePrefixesFunction;
private BugReporter bugReporter = BugReporter.defaultInstance();
+ private SkyKeyStateReceiver skyKeyStateReceiver = SkyKeyStateReceiver.NULL_INSTANCE;
private Builder() {}
@@ -1082,6 +1085,7 @@
externalPackageHelper,
actionOnIOExceptionReadingBuildFile,
managedDirectoriesKnowledge,
+ skyKeyStateReceiver,
bugReporter);
skyframeExecutor.init();
return skyframeExecutor;
@@ -1174,6 +1178,11 @@
return this;
}
+ public Builder setSkyKeyStateReceiver(SkyKeyStateReceiver skyKeyStateReceiver) {
+ this.skyKeyStateReceiver = Preconditions.checkNotNull(skyKeyStateReceiver);
+ return this;
+ }
+
public Builder setManagedDirectoriesKnowledge(
@Nullable ManagedDirectoriesKnowledge managedDirectoriesKnowledge) {
this.managedDirectoriesKnowledge = managedDirectoriesKnowledge;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorFactory.java b/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorFactory.java
index 42220a3..a838c29 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorFactory.java
@@ -38,6 +38,7 @@
ImmutableMap<SkyFunctionName, SkyFunction> extraSkyFunctions,
Iterable<SkyValueDirtinessChecker> customDirtinessCheckers,
@Nullable ManagedDirectoriesKnowledge managedDirectoriesKnowledge,
+ SkyframeExecutor.SkyKeyStateReceiver skyKeyStateReceiver,
BugReporter bugReporter) {
return BazelSkyframeExecutorConstants.newBazelSkyframeExecutorBuilder()
.setPkgFactory(pkgFactory)
@@ -49,6 +50,7 @@
.setExtraSkyFunctions(extraSkyFunctions)
.setCustomDirtinessCheckers(customDirtinessCheckers)
.setManagedDirectoriesKnowledge(managedDirectoriesKnowledge)
+ .setSkyKeyStateReceiver(skyKeyStateReceiver)
.setBugReporter(bugReporter)
.build();
}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeActionExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeActionExecutor.java
index 7c9fd4e..3a4c3bc 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeActionExecutor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeActionExecutor.java
@@ -66,6 +66,7 @@
import com.google.devtools.build.lib.actions.ScanningActionEvent;
import com.google.devtools.build.lib.actions.SpawnResult.MetadataLog;
import com.google.devtools.build.lib.actions.StoppedScanningActionEvent;
+import com.google.devtools.build.lib.actions.ThreadStateReceiver;
import com.google.devtools.build.lib.actions.UserExecException;
import com.google.devtools.build.lib.actions.cache.MetadataHandler;
import com.google.devtools.build.lib.actions.cache.MetadataInjector;
@@ -116,6 +117,7 @@
import java.util.SortedMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.Function;
import java.util.function.Supplier;
import javax.annotation.Nullable;
@@ -148,6 +150,7 @@
private final MetadataConsumerForMetrics outputArtifactsSeen;
private final MetadataConsumerForMetrics outputArtifactsFromActionCache;
private final AtomicReference<FilesystemCalls> syscalls;
+ private final Function<SkyKey, ThreadStateReceiver> threadStateReceiverFactory;
private Reporter reporter;
private Map<String, String> clientEnv = ImmutableMap.of();
private Executor executorEngine;
@@ -220,7 +223,8 @@
AtomicReference<ActionExecutionStatusReporter> statusReporterRef,
Supplier<ImmutableList<Root>> sourceRootSupplier,
PathFragment relativeOutputPath,
- AtomicReference<FilesystemCalls> syscalls) {
+ AtomicReference<FilesystemCalls> syscalls,
+ Function<SkyKey, ThreadStateReceiver> threadStateReceiverFactory) {
this.actionKeyContext = actionKeyContext;
this.outputArtifactsSeen = outputArtifactsSeen;
this.outputArtifactsFromActionCache = outputArtifactsFromActionCache;
@@ -228,6 +232,7 @@
this.sourceRootSupplier = sourceRootSupplier;
this.relativeOutputPath = relativeOutputPath;
this.syscalls = syscalls;
+ this.threadStateReceiverFactory = threadStateReceiverFactory;
}
SharedActionCallback getSharedActionCallback(
@@ -447,7 +452,7 @@
topLevelFilesets,
actionFileSystem,
skyframeDepsResult,
- syscalls);
+ actionLookupData);
if (actionCacheChecker.isActionExecutionProhibited(action)) {
// We can't execute an action (e.g. because --check_???_up_to_date option was used). Fail the
@@ -514,7 +519,7 @@
ImmutableMap<Artifact, ImmutableList<FilesetOutputSymlink>> topLevelFilesets,
@Nullable FileSystem actionFileSystem,
@Nullable Object skyframeDepsResult,
- AtomicReference<FilesystemCalls> syscalls)
+ ActionLookupData actionLookupData)
throws InterruptedException {
boolean emitProgressEvents = shouldEmitProgressEvents(action);
ArtifactPathResolver artifactPathResolver =
@@ -550,7 +555,8 @@
actionFileSystem,
skyframeDepsResult,
nestedSetExpander,
- syscalls.get());
+ syscalls.get(),
+ threadStateReceiverFactory.apply(actionLookupData));
}
private static void closeContext(
@@ -752,7 +758,8 @@
env,
actionFileSystem,
nestedSetExpander,
- syscalls.get());
+ syscalls.get(),
+ threadStateReceiverFactory.apply(actionLookupData));
if (actionFileSystem != null) {
updateActionFileSystemContext(
actionFileSystem,
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
index b0f3140..12c4572 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
@@ -65,6 +65,7 @@
import com.google.devtools.build.lib.actions.FilesetOutputSymlink;
import com.google.devtools.build.lib.actions.MetadataProvider;
import com.google.devtools.build.lib.actions.ResourceManager;
+import com.google.devtools.build.lib.actions.ThreadStateReceiver;
import com.google.devtools.build.lib.actions.UserExecException;
import com.google.devtools.build.lib.analysis.AnalysisOptions;
import com.google.devtools.build.lib.analysis.AnalysisProtos.ActionGraphContainer;
@@ -359,6 +360,8 @@
private final boolean shouldUnblockCpuWorkWhenFetchingDeps;
+ private final SkyKeyStateReceiver skyKeyStateReceiver;
+
private PerBuildSyscallCache perBuildSyscallCache;
private final PathResolverFactory pathResolverFactory = new PathResolverFactoryImpl();
@@ -418,6 +421,7 @@
@Nullable PackageProgressReceiver packageProgress,
@Nullable ConfiguredTargetProgressReceiver configuredTargetProgress,
@Nullable ManagedDirectoriesKnowledge managedDirectoriesKnowledge,
+ SkyKeyStateReceiver skyKeyStateReceiver,
BugReporter bugReporter) {
// Strictly speaking, these arguments are not required for initialization, but all current
// callsites have them at hand, so we might as well set them during construction.
@@ -426,6 +430,7 @@
this.pkgFactory = pkgFactory;
this.shouldUnblockCpuWorkWhenFetchingDeps = shouldUnblockCpuWorkWhenFetchingDeps;
this.graphInconsistencyReceiver = graphInconsistencyReceiver;
+ this.skyKeyStateReceiver = skyKeyStateReceiver;
this.bugReporter = bugReporter;
this.pkgFactory.setSyscalls(syscalls);
this.workspaceStatusActionFactory = workspaceStatusActionFactory;
@@ -452,7 +457,8 @@
statusReporterRef,
this::getPathEntries,
PathFragment.create(directories.getRelativeOutputPath()),
- syscalls);
+ syscalls,
+ skyKeyStateReceiver::makeThreadStateReceiver);
this.artifactFactory =
new ArtifactFactory(
/* execRootParent= */ directories.getExecRootBase(),
@@ -547,7 +553,8 @@
actionOnIOExceptionReadingBuildFile,
tracksStateForIncrementality()
? IncrementalityIntent.INCREMENTAL
- : IncrementalityIntent.NON_INCREMENTAL));
+ : IncrementalityIntent.NON_INCREMENTAL,
+ skyKeyStateReceiver::makeThreadStateReceiver));
map.put(SkyFunctions.PACKAGE_ERROR, new PackageErrorFunction());
map.put(SkyFunctions.PACKAGE_ERROR_MESSAGE, new PackageErrorMessageFunction());
map.put(SkyFunctions.TARGET_PATTERN_ERROR, new TargetPatternErrorFunction());
@@ -3028,12 +3035,29 @@
}
@Override
+ public void stateStarting(SkyKey skyKey, NodeState nodeState) {
+ if (NodeState.COMPUTE.equals(nodeState)) {
+ skyKeyStateReceiver.computationStarted(skyKey);
+ }
+ }
+
+ @Override
+ public void stateEnding(SkyKey skyKey, NodeState nodeState, long elapsedTimeNanos) {
+ if (NodeState.COMPUTE.equals(nodeState)) {
+ skyKeyStateReceiver.computationEnded(skyKey);
+ }
+ }
+
+ @Override
public void evaluated(
SkyKey skyKey,
@Nullable SkyValue newValue,
@Nullable ErrorInfo newError,
Supplier<EvaluationSuccessState> evaluationSuccessState,
EvaluationState state) {
+ if (EvaluationState.BUILT.equals(state)) {
+ skyKeyStateReceiver.evaluated(skyKey);
+ }
if (ignoreInvalidations) {
return;
}
@@ -3200,4 +3224,22 @@
.build();
return buildDriver.evaluate(roots, evaluationContext);
}
+
+ /** Receiver for successfully evaluated/doing computation {@link SkyKey}s. */
+ public interface SkyKeyStateReceiver {
+ SkyKeyStateReceiver NULL_INSTANCE = new SkyKeyStateReceiver() {};
+
+ /** Called when {@code key}'s associated {@link SkyFunction#compute} is called. */
+ default void computationStarted(SkyKey key) {}
+
+ /** Called when {@code key}'s associated {@link SkyFunction#compute} has finished. */
+ default void computationEnded(SkyKey key) {}
+
+ /** Called when {@code key} has been evaluated and has a value. */
+ default void evaluated(SkyKey key) {}
+
+ default ThreadStateReceiver makeThreadStateReceiver(SkyKey key) {
+ return ThreadStateReceiver.NULL_INSTANCE;
+ }
+ }
}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutorFactory.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutorFactory.java
index dbc0e33..46451e1 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutorFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutorFactory.java
@@ -36,6 +36,7 @@
* @param fileSystem the Blaze file system
* @param directories Blaze directories
* @param workspaceStatusActionFactory a factory for creating WorkspaceStatusAction objects
+ * @param skyKeyStateReceiver a receiver for SkyKeys as they start evaluating and are evaluated
* @param bugReporter BugReporter: always BugReporter.defaultInstance() outside of Java tests
* @return an instance of the SkyframeExecutor
* @throws AbruptExitException if the executor cannot be created
@@ -50,6 +51,7 @@
ImmutableMap<SkyFunctionName, SkyFunction> extraSkyFunctions,
Iterable<SkyValueDirtinessChecker> customDirtinessCheckers,
ManagedDirectoriesKnowledge managedDirectoriesKnowledge,
+ SkyframeExecutor.SkyKeyStateReceiver skyKeyStateReceiver,
BugReporter bugReporter)
throws AbruptExitException;
}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/packages/AbstractPackageLoader.java b/src/main/java/com/google/devtools/build/lib/skyframe/packages/AbstractPackageLoader.java
index 589bf7f..2eb0449 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/packages/AbstractPackageLoader.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/packages/AbstractPackageLoader.java
@@ -27,6 +27,7 @@
import com.google.common.hash.HashFunction;
import com.google.devtools.build.lib.actions.FileStateValue;
import com.google.devtools.build.lib.actions.FileValue;
+import com.google.devtools.build.lib.actions.ThreadStateReceiver;
import com.google.devtools.build.lib.analysis.BlazeDirectories;
import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
import com.google.devtools.build.lib.analysis.ServerDirectories;
@@ -513,7 +514,8 @@
/*packageProgress=*/ null,
getActionOnIOExceptionReadingBuildFile(),
// Tell PackageFunction to optimize for our use-case of no incrementality.
- IncrementalityIntent.NON_INCREMENTAL))
+ IncrementalityIntent.NON_INCREMENTAL,
+ k -> ThreadStateReceiver.NULL_INSTANCE))
.putAll(extraSkyFunctions);
return builder.build();
}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/packages/BUILD b/src/main/java/com/google/devtools/build/lib/skyframe/packages/BUILD
index ee61ac0..bf0855e 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/packages/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/packages/BUILD
@@ -29,6 +29,7 @@
deps = [
":PackageLoader",
"//src/main/java/com/google/devtools/build/lib/actions:file_metadata",
+ "//src/main/java/com/google/devtools/build/lib/actions:thread_state_receiver",
"//src/main/java/com/google/devtools/build/lib/analysis:analysis_cluster",
"//src/main/java/com/google/devtools/build/lib/analysis:blaze_directories",
"//src/main/java/com/google/devtools/build/lib/analysis:server_directories",