Extract ReverseDepsUtil interface so that InMemoryNodeEntry can be partially isolated from implementation details.
--
MOS_MIGRATED_REVID=108523104
diff --git a/src/main/java/com/google/devtools/build/skyframe/InMemoryNodeEntry.java b/src/main/java/com/google/devtools/build/skyframe/InMemoryNodeEntry.java
index 8c1fa7f..261c836 100644
--- a/src/main/java/com/google/devtools/build/skyframe/InMemoryNodeEntry.java
+++ b/src/main/java/com/google/devtools/build/skyframe/InMemoryNodeEntry.java
@@ -98,14 +98,14 @@
* are O(N). Originally reverseDeps was a HashSet, but because of memory consumption we switched
* to a list.
*
- * <p>Internally, ReverseDepsUtil consolidates this data periodically, and when the set of reverse
- * deps is requested. While this operation is not free, it can be done more effectively than
- * trying to remove/check each dirty reverse dependency individually (O(N) each time).
+ * <p>Internally, ReverseDepsUtilImpl consolidates this data periodically, and when the set of
+ * reverse deps is requested. While this operation is not free, it can be done more effectively
+ * than trying to remove/check each dirty reverse dependency individually (O(N) each time).
*/
private List<Object> reverseDepsDataToConsolidate = null;
protected static final ReverseDepsUtil<InMemoryNodeEntry> REVERSE_DEPS_UTIL =
- new ReverseDepsUtil<InMemoryNodeEntry>() {
+ new ReverseDepsUtilImpl<InMemoryNodeEntry>() {
@Override
void setReverseDepsObject(InMemoryNodeEntry container, Object object) {
container.reverseDeps = object;
@@ -209,16 +209,23 @@
return ValueWithMetadata.getMaybeErrorInfo(value);
}
+ /**
+ * Puts entry in "done" state, as checked by {@link #isDone}. Subclasses that override one should
+ * override the other.
+ */
+ protected void markDone() {
+ buildingState = null;
+ }
+
protected synchronized Set<SkyKey> setStateFinishedAndReturnReverseDeps() {
// Get reverse deps that need to be signaled.
ImmutableSet<SkyKey> reverseDepsToSignal = buildingState.getReverseDepsToSignal();
- REVERSE_DEPS_UTIL.addReverseDeps(this, reverseDepsToSignal);
+ getReverseDepsUtil().addReverseDeps(this, reverseDepsToSignal);
// Force consistency check.
- REVERSE_DEPS_UTIL.getReverseDeps(this);
+ getReverseDepsUtil().getReverseDeps(this);
this.directDeps = buildingState.getFinishedDirectDeps().compress();
- // Set state of entry to done.
- buildingState = null;
+ markDone();
if (!keepEdges()) {
this.directDeps = null;
@@ -257,15 +264,19 @@
return setStateFinishedAndReturnReverseDeps();
}
+ protected ReverseDepsUtil<InMemoryNodeEntry> getReverseDepsUtil() {
+ return REVERSE_DEPS_UTIL;
+ }
+
@Override
public synchronized DependencyState addReverseDepAndCheckIfDone(SkyKey reverseDep) {
if (reverseDep != null) {
if (keepEdges()) {
- REVERSE_DEPS_UTIL.maybeCheckReverseDepNotPresent(this, reverseDep);
+ getReverseDepsUtil().maybeCheckReverseDepNotPresent(this, reverseDep);
}
if (isDone()) {
if (keepEdges()) {
- REVERSE_DEPS_UTIL.addReverseDeps(this, ImmutableList.of(reverseDep));
+ getReverseDepsUtil().addReverseDeps(this, ImmutableList.of(reverseDep));
}
} else {
// Parent should never register itself twice in the same build.
@@ -284,10 +295,10 @@
Preconditions.checkNotNull(reverseDep, this);
Preconditions.checkState(keepEdges(), "%s %s", reverseDep, this);
if (!isDone()) {
- REVERSE_DEPS_UTIL.removeReverseDep(this, reverseDep);
+ getReverseDepsUtil().removeReverseDep(this, reverseDep);
buildingState.addReverseDepToSignal(reverseDep);
} else {
- REVERSE_DEPS_UTIL.checkReverseDep(this, reverseDep);
+ getReverseDepsUtil().checkReverseDep(this, reverseDep);
}
return addReverseDepAndCheckIfDone(null);
}
@@ -297,7 +308,7 @@
if (!keepEdges()) {
return;
}
- REVERSE_DEPS_UTIL.removeReverseDep(this, reverseDep);
+ getReverseDepsUtil().removeReverseDep(this, reverseDep);
}
@Override
@@ -308,7 +319,7 @@
@Override
public synchronized Iterable<SkyKey> getReverseDeps() {
assertKeepEdges();
- Iterable<SkyKey> reverseDeps = REVERSE_DEPS_UTIL.getReverseDeps(this);
+ Iterable<SkyKey> reverseDeps = getReverseDepsUtil().getReverseDeps(this);
if (isDone()) {
return reverseDeps;
} else {
@@ -349,7 +360,7 @@
buildingState =
BuildingState.newDirtyState(isChanged, GroupedList.<SkyKey>create(directDeps), value);
value = null;
- return new MarkedDirtyResult(REVERSE_DEPS_UTIL.getReverseDeps(this));
+ return new MarkedDirtyResult(getReverseDepsUtil().getReverseDeps(this));
}
// The caller may be simultaneously trying to mark this node dirty and changed, and the dirty
// thread may have lost the race, but it is the caller's responsibility not to try to mark
@@ -452,7 +463,7 @@
.add("lastChangedVersion", lastChangedVersion)
.add("lastEvaluatedVersion", lastEvaluatedVersion)
.add("directDeps", directDeps == null ? null : GroupedList.create(directDeps))
- .add("reverseDeps", REVERSE_DEPS_UTIL.toString(this))
+ .add("reverseDeps", getReverseDepsUtil().toString(this))
.add("buildingState", buildingState)
.toString();
}
@@ -469,7 +480,7 @@
nodeEntry.value = value;
nodeEntry.lastChangedVersion = this.lastChangedVersion;
nodeEntry.lastEvaluatedVersion = this.lastEvaluatedVersion;
- REVERSE_DEPS_UTIL.addReverseDeps(nodeEntry, REVERSE_DEPS_UTIL.getReverseDeps(this));
+ getReverseDepsUtil().addReverseDeps(nodeEntry, getReverseDepsUtil().getReverseDeps(this));
nodeEntry.directDeps = directDeps;
nodeEntry.buildingState = null;
return nodeEntry;