diff options
author | Janak Ramakrishnan <janakr@google.com> | 2016-08-25 23:49:45 +0000 |
---|---|---|
committer | John Cater <jcater@google.com> | 2016-08-26 18:39:32 +0000 |
commit | 1ac4568f25f93548927db9080308b0d2e736f7a3 (patch) | |
tree | 32ab67af11de8ff304d23d7a4dc9d71eeeda9a51 /src/main/java/com/google/devtools/build/skyframe/ParallelEvaluatorContext.java | |
parent | aa9107b4fd1a8b8193428617bab4c694f24124a1 (diff) |
Allow cycle detector to be injected into ParallelEvaluator, so that callers can use different cycle detection algorithms if they wish.
--
MOS_MIGRATED_REVID=131347160
Diffstat (limited to 'src/main/java/com/google/devtools/build/skyframe/ParallelEvaluatorContext.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/skyframe/ParallelEvaluatorContext.java | 41 |
1 files changed, 27 insertions, 14 deletions
diff --git a/src/main/java/com/google/devtools/build/skyframe/ParallelEvaluatorContext.java b/src/main/java/com/google/devtools/build/skyframe/ParallelEvaluatorContext.java index dbfd56760e..f364a71f4b 100644 --- a/src/main/java/com/google/devtools/build/skyframe/ParallelEvaluatorContext.java +++ b/src/main/java/com/google/devtools/build/skyframe/ParallelEvaluatorContext.java @@ -36,6 +36,12 @@ import javax.annotation.Nullable; * <p>Also used during cycle detection. */ class ParallelEvaluatorContext { + enum EnqueueParentBehavior { + ENQUEUE, + SIGNAL, + NO_ACTION + } + private final QueryableGraph graph; private final Version graphVersion; private final ImmutableMap<SkyFunctionName, ? extends SkyFunction> skyFunctions; @@ -133,27 +139,34 @@ class ParallelEvaluatorContext { * cycles). */ void signalValuesAndEnqueueIfReady( - SkyKey skyKey, Iterable<SkyKey> keys, Version version, boolean enqueueParents) + SkyKey skyKey, Iterable<SkyKey> keys, Version version, EnqueueParentBehavior enqueueParents) throws InterruptedException { // No fields of the entry are needed here, since we're just enqueuing for evaluation, but more // importantly, these hints are not respected for not-done nodes. If they are, we may need to // alter this hint. Map<SkyKey, ? extends NodeEntry> batch = graph.getBatch(skyKey, Reason.SIGNAL_DEP, keys); - if (enqueueParents) { - for (SkyKey key : keys) { - NodeEntry entry = Preconditions.checkNotNull(batch.get(key), key); - if (entry.signalDep(version)) { - getVisitor().enqueueEvaluation(key); + switch (enqueueParents) { + case ENQUEUE: + for (SkyKey key : keys) { + NodeEntry entry = Preconditions.checkNotNull(batch.get(key), key); + if (entry.signalDep(version)) { + getVisitor().enqueueEvaluation(key); + } } - } - } else { - for (SkyKey key : keys) { - NodeEntry entry = Preconditions.checkNotNull(batch.get(key), key); - if (!entry.isDone()) { - // In cycles, we can have parents that are already done. - entry.signalDep(version); + return; + case SIGNAL: + for (SkyKey key : keys) { + NodeEntry entry = Preconditions.checkNotNull(batch.get(key), key); + if (!entry.isDone()) { + // In cycles, we can have parents that are already done. + entry.signalDep(version); + } } - } + return; + case NO_ACTION: + return; + default: + throw new IllegalStateException(enqueueParents + ", " + skyKey); } } |