diff options
author | 2015-08-21 17:44:41 +0000 | |
---|---|---|
committer | 2015-08-24 14:02:12 +0000 | |
commit | f3ec7c4ffd59936b668968d18865f80497e7d544 (patch) | |
tree | 555a23ce835772a46c693129a4d425e2d1701de9 /src/main/java/com/google/devtools/build/lib/skyframe | |
parent | 65ac3559a0377f3e8df596d63e0d91502bb09a86 (diff) |
Implement hashCode, equals for TransitiveTraversalValue and related SkyValues
--
MOS_MIGRATED_REVID=101233095
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/skyframe')
3 files changed, 47 insertions, 1 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternValue.java index fe7a0da76b..9ffac75455 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternValue.java @@ -32,7 +32,7 @@ import java.util.List; * invoked only for its side effect (i.e. ensuring the graph contains targets matching the * pattern and its transitive dependencies), this value carries no information. * - * <p>Because the returned value is always the same object, this value and the + * <p>Because the returned value is always equal to objects that share its type, this value and the * {@link PrepareDepsOfPatternFunction} which computes it are incompatible with change pruning. It * should only be requested by consumers who do not require reevaluation when * {@link PrepareDepsOfPatternFunction} is reevaluated. Safe consumers include, e.g., top-level @@ -40,11 +40,23 @@ import java.util.List; * side-effects. */ public class PrepareDepsOfPatternValue implements SkyValue { + // Note that this value does not guarantee singleton-like reference equality because we use Java + // deserialization. Java deserialization can create other instances. public static final PrepareDepsOfPatternValue INSTANCE = new PrepareDepsOfPatternValue(); private PrepareDepsOfPatternValue() { } + @Override + public boolean equals(Object o) { + return o instanceof PrepareDepsOfPatternValue; + } + + @Override + public int hashCode() { + return 42; + } + /** * Returns an iterable of {@link PrepareDepsOfPatternSkyKeyOrException}, with {@link * TargetPatternKey} arguments. Negative target patterns of type other than {@link diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TargetMarkerValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/TargetMarkerValue.java index eef70843fd..d325de5496 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/TargetMarkerValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/TargetMarkerValue.java @@ -26,11 +26,23 @@ import com.google.devtools.build.skyframe.SkyValue; @ThreadSafe public final class TargetMarkerValue implements SkyValue { + // Note that this value does not guarantee singleton-like reference equality because we use Java + // deserialization. java deserialization can create other instances. static final TargetMarkerValue TARGET_MARKER_INSTANCE = new TargetMarkerValue(); private TargetMarkerValue() { } + @Override + public boolean equals(Object o) { + return o instanceof TargetMarkerValue; + } + + @Override + public int hashCode() { + return 42; + } + @ThreadSafe public static SkyKey key(Label label) { return new SkyKey(SkyFunctions.TARGET_MARKER, label); diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalValue.java index 8216381994..829bc7d7f0 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalValue.java @@ -20,6 +20,8 @@ import com.google.devtools.build.lib.syntax.Label; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; +import java.util.Objects; + import javax.annotation.Nullable; /** @@ -33,6 +35,9 @@ public class TransitiveTraversalValue implements SkyValue { @Nullable private final NoSuchTargetException errorLoadingTarget; + // Note that this value does not guarantee singleton-like reference equality for successful + // {@link TransitiveTraversalValue}s because we use Java deserialization. Java deserialization can + // create other instances. static final TransitiveTraversalValue SUCCESSFUL_TRANSITIVE_TRAVERSAL_VALUE = new TransitiveTraversalValue(null); @@ -51,6 +56,23 @@ public class TransitiveTraversalValue implements SkyValue { return errorLoadingTarget; } + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof TransitiveTraversalValue)) { + return false; + } + TransitiveTraversalValue that = (TransitiveTraversalValue) o; + return Objects.equals(this.errorLoadingTarget, that.errorLoadingTarget); + } + + @Override + public int hashCode() { + return Objects.hashCode(errorLoadingTarget); + } + @ThreadSafe public static SkyKey key(Label label) { return new SkyKey(SkyFunctions.TRANSITIVE_TRAVERSAL, label); |