Intern IntVersions.
--
MOS_MIGRATED_REVID=113197641
diff --git a/src/main/java/com/google/devtools/build/skyframe/InMemoryMemoizingEvaluator.java b/src/main/java/com/google/devtools/build/skyframe/InMemoryMemoizingEvaluator.java
index 78a4e1d..87e1a47 100644
--- a/src/main/java/com/google/devtools/build/skyframe/InMemoryMemoizingEvaluator.java
+++ b/src/main/java/com/google/devtools/build/skyframe/InMemoryMemoizingEvaluator.java
@@ -124,7 +124,7 @@
@Override
public void deleteDirty(long versionAgeLimit) {
Preconditions.checkArgument(versionAgeLimit >= 0);
- final Version threshold = new IntVersion(lastGraphVersion.getVal() - versionAgeLimit);
+ final Version threshold = IntVersion.of(lastGraphVersion.getVal() - versionAgeLimit);
valuesToDelete.addAll(
Sets.filter(dirtyKeyTracker.getDirtyKeys(), new Predicate<SkyKey>() {
@Override
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 0cee74c..c23b822 100644
--- a/src/main/java/com/google/devtools/build/skyframe/InMemoryNodeEntry.java
+++ b/src/main/java/com/google/devtools/build/skyframe/InMemoryNodeEntry.java
@@ -329,7 +329,7 @@
@Override
public synchronized boolean signalDep() {
- return signalDep(/*childVersion=*/new IntVersion(Long.MAX_VALUE));
+ return signalDep(/*childVersion=*/ IntVersion.of(Long.MAX_VALUE));
}
@Override
diff --git a/src/main/java/com/google/devtools/build/skyframe/IntVersion.java b/src/main/java/com/google/devtools/build/skyframe/IntVersion.java
index 38b2d71..cfb3484 100644
--- a/src/main/java/com/google/devtools/build/skyframe/IntVersion.java
+++ b/src/main/java/com/google/devtools/build/skyframe/IntVersion.java
@@ -13,16 +13,20 @@
// limitations under the License.
package com.google.devtools.build.skyframe;
+import com.google.common.collect.Interner;
+import com.google.common.collect.Interners;
+
import java.io.Serializable;
/**
* Versioning scheme based on integers.
*/
public final class IntVersion implements Version, Serializable {
+ private static final Interner<IntVersion> interner = Interners.newWeakInterner();
private final long val;
- public IntVersion(long val) {
+ private IntVersion(long val) {
this.val = val;
}
@@ -31,11 +35,15 @@
}
public IntVersion next() {
- return new IntVersion(val + 1);
+ return of(val + 1);
}
public IntVersion previous() {
- return new IntVersion(val - 1);
+ return of(val - 1);
+ }
+
+ public static IntVersion of(long val) {
+ return interner.intern(new IntVersion(val));
}
@Override
diff --git a/src/main/java/com/google/devtools/build/skyframe/SequentialBuildDriver.java b/src/main/java/com/google/devtools/build/skyframe/SequentialBuildDriver.java
index 99e2ef0..886c40a 100644
--- a/src/main/java/com/google/devtools/build/skyframe/SequentialBuildDriver.java
+++ b/src/main/java/com/google/devtools/build/skyframe/SequentialBuildDriver.java
@@ -28,7 +28,7 @@
public SequentialBuildDriver(MemoizingEvaluator evaluator) {
this.memoizingEvaluator = Preconditions.checkNotNull(evaluator);
- this.curVersion = new IntVersion(0);
+ this.curVersion = IntVersion.of(0);
}
@Override
diff --git a/src/test/java/com/google/devtools/build/skyframe/EagerInvalidatorTest.java b/src/test/java/com/google/devtools/build/skyframe/EagerInvalidatorTest.java
index fbe5cc8..49706c8 100644
--- a/src/test/java/com/google/devtools/build/skyframe/EagerInvalidatorTest.java
+++ b/src/test/java/com/google/devtools/build/skyframe/EagerInvalidatorTest.java
@@ -69,7 +69,7 @@
protected AtomicReference<InvalidatingNodeVisitor<?>> visitor = new AtomicReference<>();
protected DirtyKeyTrackerImpl dirtyKeyTracker;
- private IntVersion graphVersion = new IntVersion(0);
+ private IntVersion graphVersion = IntVersion.of(0);
@After
public void assertNoTrackedErrors() {
diff --git a/src/test/java/com/google/devtools/build/skyframe/GraphConcurrencyTest.java b/src/test/java/com/google/devtools/build/skyframe/GraphConcurrencyTest.java
index 52b6934..e0d877e 100644
--- a/src/test/java/com/google/devtools/build/skyframe/GraphConcurrencyTest.java
+++ b/src/test/java/com/google/devtools/build/skyframe/GraphConcurrencyTest.java
@@ -58,7 +58,7 @@
protected abstract ProcessableGraph getGraph(Version version) throws Exception;
- private static final IntVersion startingVersion = new IntVersion(42);
+ private static final IntVersion startingVersion = IntVersion.of(42);
@Before
public void init() throws Exception {
diff --git a/src/test/java/com/google/devtools/build/skyframe/InMemoryNodeEntryTest.java b/src/test/java/com/google/devtools/build/skyframe/InMemoryNodeEntryTest.java
index 2c45174..f29537d 100644
--- a/src/test/java/com/google/devtools/build/skyframe/InMemoryNodeEntryTest.java
+++ b/src/test/java/com/google/devtools/build/skyframe/InMemoryNodeEntryTest.java
@@ -89,7 +89,7 @@
assertThat(setValue(entry, new SkyValue() {},
/*errorInfo=*/null, /*graphVersion=*/0L)).isEmpty();
assertTrue(entry.isDone());
- assertEquals(new IntVersion(0L), entry.getVersion());
+ assertEquals(IntVersion.of(0L), entry.getVersion());
assertThat(entry.getDirectDeps()).containsExactly(dep1, dep2, dep3);
}
@@ -226,7 +226,7 @@
assertThat(entry.markRebuildingAndGetAllRemainingDirtyDirectDeps()).containsExactly(dep);
assertThat(setValue(entry, new SkyValue() {}, /*errorInfo=*/null,
/*graphVersion=*/1L)).containsExactly(parent);
- assertEquals(new IntVersion(1L), entry.getVersion());
+ assertEquals(IntVersion.of(1L), entry.getVersion());
}
@Test
@@ -372,11 +372,11 @@
assertEquals(NodeEntry.DirtyState.CHECK_DEPENDENCIES, entry.getDirtyState());
assertThat(entry.getNextDirtyDirectDeps()).containsExactly(dep);
addTemporaryDirectDep(entry, dep);
- entry.signalDep(new IntVersion(0L));
+ entry.signalDep(IntVersion.of(0L));
assertEquals(NodeEntry.DirtyState.VERIFIED_CLEAN, entry.getDirtyState());
assertThat(entry.markClean()).containsExactly(parent);
assertTrue(entry.isDone());
- assertEquals(new IntVersion(0L), entry.getVersion());
+ assertEquals(IntVersion.of(0L), entry.getVersion());
}
private static class IntegerValue implements SkyValue {
@@ -411,13 +411,13 @@
entry.addReverseDepAndCheckIfDone(null); // Start evaluation.
assertThat(entry.getNextDirtyDirectDeps()).containsExactly(dep);
addTemporaryDirectDep(entry, dep);
- entry.signalDep(new IntVersion(1L));
+ entry.signalDep(IntVersion.of(1L));
assertEquals(NodeEntry.DirtyState.NEEDS_REBUILDING, entry.getDirtyState());
assertThat(entry.getTemporaryDirectDeps()).containsExactly(dep);
assertThat(entry.markRebuildingAndGetAllRemainingDirtyDirectDeps()).isEmpty();
setValue(entry, new IntegerValue(5), /*errorInfo=*/null, /*graphVersion=*/1L);
assertTrue(entry.isDone());
- assertEquals(new IntVersion(0L), entry.getVersion());
+ assertEquals(IntVersion.of(0L), entry.getVersion());
}
@Test
@@ -440,7 +440,7 @@
assertEquals(NodeEntry.DirtyState.CHECK_DEPENDENCIES, entry.getDirtyState());
assertThat(entry.getNextDirtyDirectDeps()).containsExactly(dep);
addTemporaryDirectDep(entry, dep);
- entry.signalDep(new IntVersion(1L));
+ entry.signalDep(IntVersion.of(1L));
assertEquals(NodeEntry.DirtyState.NEEDS_REBUILDING, entry.getDirtyState());
assertThat(entry.getTemporaryDirectDeps()).containsExactly(dep);
ReifiedSkyFunctionException exception = new ReifiedSkyFunctionException(
@@ -450,7 +450,7 @@
setValue(entry, new IntegerValue(5), ErrorInfo.fromException(exception, false),
/*graphVersion=*/1L);
assertTrue(entry.isDone());
- assertEquals("Version increments when setValue changes", new IntVersion(1), entry.getVersion());
+ assertEquals("Version increments when setValue changes", IntVersion.of(1), entry.getVersion());
}
@Test
@@ -477,7 +477,7 @@
assertEquals(NodeEntry.DirtyState.CHECK_DEPENDENCIES, entry.getDirtyState());
assertThat(entry.getNextDirtyDirectDeps()).containsExactly(dep);
addTemporaryDirectDep(entry, dep);
- entry.signalDep(new IntVersion(1L));
+ entry.signalDep(IntVersion.of(1L));
assertEquals(NodeEntry.DirtyState.NEEDS_REBUILDING, entry.getDirtyState());
assertThat(entry.getTemporaryDirectDeps()).containsExactly(dep);
assertThat(entry.markRebuildingAndGetAllRemainingDirtyDirectDeps())
@@ -488,7 +488,7 @@
setValue(entry, new IntegerValue(5), /*errorInfo=*/ null, /*graphVersion=*/ 1L);
assertTrue(entry.isDone());
assertEquals(
- "Version does not change when dep group reordered", new IntVersion(0), entry.getVersion());
+ "Version does not change when dep group reordered", IntVersion.of(0), entry.getVersion());
}
@Test
@@ -508,14 +508,14 @@
assertEquals(NodeEntry.DirtyState.CHECK_DEPENDENCIES, entry.getDirtyState());
assertThat(entry.getNextDirtyDirectDeps()).containsExactly(dep);
addTemporaryDirectDep(entry, dep);
- entry.signalDep(new IntVersion(1L));
+ entry.signalDep(IntVersion.of(1L));
assertEquals(NodeEntry.DirtyState.NEEDS_REBUILDING, entry.getDirtyState());
assertThat(entry.getTemporaryDirectDeps()).containsExactly(dep);
assertThat(entry.markRebuildingAndGetAllRemainingDirtyDirectDeps()).isEmpty();
setValue(entry, /*value=*/null, errorInfo, /*graphVersion=*/1L);
assertTrue(entry.isDone());
// ErrorInfo is treated as a NotComparableSkyValue, so it is not pruned.
- assertEquals(new IntVersion(1L), entry.getVersion());
+ assertEquals(IntVersion.of(1L), entry.getVersion());
}
@Test
@@ -536,8 +536,8 @@
assertEquals(NodeEntry.DirtyState.CHECK_DEPENDENCIES, entry.getDirtyState());
assertThat(entry.getNextDirtyDirectDeps()).containsExactly(dep, dep2);
addTemporaryDirectDeps(entry, dep, dep2);
- entry.signalDep(new IntVersion(0L));
- entry.signalDep(new IntVersion(0L));
+ entry.signalDep(IntVersion.of(0L));
+ entry.signalDep(IntVersion.of(0L));
assertEquals(NodeEntry.DirtyState.CHECK_DEPENDENCIES, entry.getDirtyState());
assertThat(entry.getNextDirtyDirectDeps()).containsExactly(dep3);
}
@@ -567,7 +567,7 @@
assertEquals(NodeEntry.DirtyState.CHECK_DEPENDENCIES, entry.getDirtyState());
assertThat(entry.getNextDirtyDirectDeps()).containsExactly(dep);
addTemporaryDirectDep(entry, dep);
- entry.signalDep(new IntVersion(0L));
+ entry.signalDep(IntVersion.of(0L));
assertEquals(NodeEntry.DirtyState.CHECK_DEPENDENCIES, entry.getDirtyState());
assertThat(entry.getNextDirtyDirectDeps()).containsExactly(dep4);
}
@@ -585,15 +585,15 @@
assertEquals(NodeEntry.DirtyState.CHECK_DEPENDENCIES, entry.getDirtyState());
assertThat(entry.getNextDirtyDirectDeps()).containsExactly(dep);
addTemporaryDirectDep(entry, dep);
- assertTrue(entry.signalDep(new IntVersion(1L)));
+ assertTrue(entry.signalDep(IntVersion.of(1L)));
assertEquals(NodeEntry.DirtyState.NEEDS_REBUILDING, entry.getDirtyState());
assertThat(entry.getTemporaryDirectDeps()).containsExactly(dep);
assertThat(entry.markRebuildingAndGetAllRemainingDirtyDirectDeps()).isEmpty();
addTemporaryDirectDep(entry, key("dep2"));
- assertTrue(entry.signalDep(new IntVersion(1L)));
+ assertTrue(entry.signalDep(IntVersion.of(1L)));
setValue(entry, new IntegerValue(5), /*errorInfo=*/null, /*graphVersion=*/1L);
assertTrue(entry.isDone());
- assertEquals("Version increments when deps change", new IntVersion(1L), entry.getVersion());
+ assertEquals("Version increments when deps change", IntVersion.of(1L), entry.getVersion());
}
@Test
@@ -614,7 +614,7 @@
for (int ii = 0; ii < 10; ii++) {
assertThat(entry.getNextDirtyDirectDeps()).containsExactly(deps.get(ii));
addTemporaryDirectDep(entry, deps.get(ii));
- assertTrue(entry.signalDep(new IntVersion(0L)));
+ assertTrue(entry.signalDep(IntVersion.of(0L)));
if (ii < 9) {
assertEquals(NodeEntry.DirtyState.CHECK_DEPENDENCIES, entry.getDirtyState());
} else {
@@ -640,7 +640,7 @@
@Test
public void testClone() {
InMemoryNodeEntry entry = new InMemoryNodeEntry();
- IntVersion version = new IntVersion(0);
+ IntVersion version = IntVersion.of(0);
IntegerValue originalValue = new IntegerValue(42);
SkyKey originalChild = key("child");
addTemporaryDirectDep(entry, originalChild);
@@ -693,7 +693,7 @@
entry.signalDep();
}
}
- entry.setValue(new IntegerValue(42), new IntVersion(42L));
+ entry.setValue(new IntegerValue(42), IntVersion.of(42L));
int i = 0;
GroupedList<SkyKey> entryGroupedDirectDeps = entry.getGroupedDirectDeps();
assertThat(Iterables.size(entryGroupedDirectDeps)).isEqualTo(groupedDirectDeps.size());
@@ -704,8 +704,8 @@
private static Set<SkyKey> setValue(NodeEntry entry, SkyValue value,
@Nullable ErrorInfo errorInfo, long graphVersion) {
- return entry.setValue(ValueWithMetadata.normal(value, errorInfo, NO_EVENTS),
- new IntVersion(graphVersion));
+ return entry.setValue(
+ ValueWithMetadata.normal(value, errorInfo, NO_EVENTS), IntVersion.of(graphVersion));
}
private static void addTemporaryDirectDep(NodeEntry entry, SkyKey key) {
diff --git a/src/test/java/com/google/devtools/build/skyframe/ParallelEvaluatorTest.java b/src/test/java/com/google/devtools/build/skyframe/ParallelEvaluatorTest.java
index c0389e0..172efd5 100644
--- a/src/test/java/com/google/devtools/build/skyframe/ParallelEvaluatorTest.java
+++ b/src/test/java/com/google/devtools/build/skyframe/ParallelEvaluatorTest.java
@@ -76,7 +76,7 @@
@RunWith(JUnit4.class)
public class ParallelEvaluatorTest {
protected ProcessableGraph graph;
- protected IntVersion graphVersion = new IntVersion(0);
+ protected IntVersion graphVersion = IntVersion.of(0);
protected GraphTester tester = new GraphTester();
private EventCollector eventCollector;