Introduce BlazeInterners, a Blaze-specific wrapper around Guava's Interners that makes an appropriate call to Interners.InternerBuilder#concurrencyLevel.
For current readers of this CL, I used this class everywhere in the Blaze codebase.
For future readers of this CL, this class should be used to create an Interner in the Blaze codebase.
--
MOS_MIGRATED_REVID=140063271
diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/Label.java b/src/main/java/com/google/devtools/build/lib/cmdline/Label.java
index 753909c..0fb7a08 100644
--- a/src/main/java/com/google/devtools/build/lib/cmdline/Label.java
+++ b/src/main/java/com/google/devtools/build/lib/cmdline/Label.java
@@ -17,8 +17,8 @@
import com.google.common.collect.ComparisonChain;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Interner;
-import com.google.common.collect.Interners;
import com.google.devtools.build.lib.cmdline.LabelValidator.BadLabelException;
+import com.google.devtools.build.lib.concurrent.BlazeInterners;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
@@ -74,7 +74,7 @@
public static final String EXTERNAL_PATH_PREFIX = "external";
- private static final Interner<Label> LABEL_INTERNER = Interners.newWeakInterner();
+ private static final Interner<Label> LABEL_INTERNER = BlazeInterners.newWeakInterner();
/**
* Factory for Labels from absolute string form. e.g.
diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/PackageIdentifier.java b/src/main/java/com/google/devtools/build/lib/cmdline/PackageIdentifier.java
index 905866f..ba48f7a 100644
--- a/src/main/java/com/google/devtools/build/lib/cmdline/PackageIdentifier.java
+++ b/src/main/java/com/google/devtools/build/lib/cmdline/PackageIdentifier.java
@@ -16,7 +16,7 @@
import com.google.common.collect.ComparisonChain;
import com.google.common.collect.Interner;
-import com.google.common.collect.Interners;
+import com.google.devtools.build.lib.concurrent.BlazeInterners;
import com.google.devtools.build.lib.util.Preconditions;
import com.google.devtools.build.lib.vfs.Canonicalizer;
import com.google.devtools.build.lib.vfs.PathFragment;
@@ -36,7 +36,7 @@
@Immutable
public final class PackageIdentifier implements Comparable<PackageIdentifier>, Serializable {
- private static final Interner<PackageIdentifier> INTERNER = Interners.newWeakInterner();
+ private static final Interner<PackageIdentifier> INTERNER = BlazeInterners.newWeakInterner();
public static PackageIdentifier create(String repository, PathFragment pkgName)
throws LabelSyntaxException {
diff --git a/src/main/java/com/google/devtools/build/lib/concurrent/BlazeInterners.java b/src/main/java/com/google/devtools/build/lib/concurrent/BlazeInterners.java
new file mode 100644
index 0000000..d54793d
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/concurrent/BlazeInterners.java
@@ -0,0 +1,35 @@
+// Copyright 2016 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+package com.google.devtools.build.lib.concurrent;
+
+import com.google.common.collect.Interner;
+import com.google.common.collect.Interners;
+import com.google.common.collect.Interners.InternerBuilder;
+
+/** Wrapper around {@link Interners}, with Blaze-specific predetermined concurrency levels. */
+public class BlazeInterners {
+ private static final int CONCURRENCY_LEVEL = Runtime.getRuntime().availableProcessors();
+
+ private static InternerBuilder setConcurrencyLevel(InternerBuilder builder) {
+ return builder.concurrencyLevel(CONCURRENCY_LEVEL);
+ }
+
+ public static <T> Interner<T> newWeakInterner() {
+ return setConcurrencyLevel(Interners.newBuilder().weak()).build();
+ }
+
+ public static <T> Interner<T> newStrongInterner() {
+ return setConcurrencyLevel(Interners.newBuilder().strong()).build();
+ }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/remote/TreeNodeRepository.java b/src/main/java/com/google/devtools/build/lib/remote/TreeNodeRepository.java
index 911097f..3ecf6fe 100644
--- a/src/main/java/com/google/devtools/build/lib/remote/TreeNodeRepository.java
+++ b/src/main/java/com/google/devtools/build/lib/remote/TreeNodeRepository.java
@@ -20,10 +20,10 @@
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Interner;
-import com.google.common.collect.Interners;
import com.google.common.collect.Iterables;
import com.google.common.collect.TreeTraverser;
import com.google.devtools.build.lib.actions.ActionInput;
+import com.google.devtools.build.lib.concurrent.BlazeInterners;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
import com.google.devtools.build.lib.remote.RemoteProtocol.ContentDigest;
@@ -172,7 +172,7 @@
}
// Keep only one canonical instance of every TreeNode in the repository.
- private final Interner<TreeNode> interner = Interners.newWeakInterner();
+ private final Interner<TreeNode> interner = BlazeInterners.newWeakInterner();
// Merkle hashes are computed and cached by the repository, therefore execRoot must
// be part of the state.
private final Path execRoot;
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/FunctionSignature.java b/src/main/java/com/google/devtools/build/lib/syntax/FunctionSignature.java
index 7643201..2903f8e 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/FunctionSignature.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/FunctionSignature.java
@@ -16,8 +16,8 @@
import com.google.auto.value.AutoValue;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Interner;
-import com.google.common.collect.Interners;
import com.google.common.collect.Lists;
+import com.google.devtools.build.lib.concurrent.BlazeInterners;
import com.google.devtools.build.lib.syntax.SkylarkList.Tuple;
import com.google.devtools.build.lib.util.Preconditions;
import com.google.devtools.build.lib.util.StringCanonicalizer;
@@ -71,7 +71,7 @@
*/
@AutoValue
public abstract static class Shape implements Serializable {
- private static final Interner<Shape> interner = Interners.newWeakInterner();
+ private static final Interner<Shape> interner = BlazeInterners.newWeakInterner();
/** Create a function signature */
public static Shape create(
@@ -154,7 +154,8 @@
}
/** Names of a FunctionSignature */
- private static final Interner<ImmutableList<String>> namesInterner = Interners.newWeakInterner();
+ private static final Interner<ImmutableList<String>> namesInterner =
+ BlazeInterners.newWeakInterner();
/** Intern a list of names */
public static ImmutableList<String> names(List<String> names) {
@@ -168,7 +169,8 @@
}
// Interner
- private static final Interner<FunctionSignature> signatureInterner = Interners.newWeakInterner();
+ private static final Interner<FunctionSignature> signatureInterner =
+ BlazeInterners.newWeakInterner();
/**
* Signatures proper.
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkType.java b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkType.java
index d6695cb..87fa012 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkType.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkType.java
@@ -20,8 +20,8 @@
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Interner;
-import com.google.common.collect.Interners;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
+import com.google.devtools.build.lib.concurrent.BlazeInterners;
import com.google.devtools.build.lib.events.Location;
import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
import com.google.devtools.build.lib.syntax.SkylarkList.MutableList;
@@ -377,7 +377,7 @@
}
private static final Interner<Combination> combinationInterner =
- Interners.<Combination>newWeakInterner();
+ BlazeInterners.<Combination>newWeakInterner();
public static SkylarkType of(SkylarkType generic, SkylarkType argument) {
// assume all combinations with TOP are the same as the simple type, and canonicalize.
diff --git a/src/main/java/com/google/devtools/build/lib/vfs/Canonicalizer.java b/src/main/java/com/google/devtools/build/lib/vfs/Canonicalizer.java
index 8b47ea8..5243c0b 100644
--- a/src/main/java/com/google/devtools/build/lib/vfs/Canonicalizer.java
+++ b/src/main/java/com/google/devtools/build/lib/vfs/Canonicalizer.java
@@ -14,7 +14,7 @@
package com.google.devtools.build.lib.vfs;
import com.google.common.collect.Interner;
-import com.google.common.collect.Interners;
+import com.google.devtools.build.lib.concurrent.BlazeInterners;
/**
* Static singleton holder for certain interning pools.
@@ -22,7 +22,7 @@
public final class Canonicalizer<E> {
private static final Interner<PathFragment> FRAGMENT_INTERNER =
- Interners.newWeakInterner();
+ BlazeInterners.newWeakInterner();
/**
* Creates an instance of Canonicalizer tracking path fragments.
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 68a2cfa..3f3761a 100644
--- a/src/main/java/com/google/devtools/build/skyframe/IntVersion.java
+++ b/src/main/java/com/google/devtools/build/skyframe/IntVersion.java
@@ -14,11 +14,11 @@
package com.google.devtools.build.skyframe;
import com.google.common.collect.Interner;
-import com.google.common.collect.Interners;
+import com.google.devtools.build.lib.concurrent.BlazeInterners;
/** Versioning scheme based on integers. */
final class IntVersion implements Version {
- private static final Interner<IntVersion> interner = Interners.newWeakInterner();
+ private static final Interner<IntVersion> interner = BlazeInterners.newWeakInterner();
private final long val;
diff --git a/src/main/java/com/google/devtools/build/skyframe/ReverseDepsUtilImpl.java b/src/main/java/com/google/devtools/build/skyframe/ReverseDepsUtilImpl.java
index 73c179d..801b0d3 100644
--- a/src/main/java/com/google/devtools/build/skyframe/ReverseDepsUtilImpl.java
+++ b/src/main/java/com/google/devtools/build/skyframe/ReverseDepsUtilImpl.java
@@ -17,10 +17,10 @@
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Interner;
-import com.google.common.collect.Interners;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.devtools.build.lib.collect.CompactHashSet;
+import com.google.devtools.build.lib.concurrent.BlazeInterners;
import com.google.devtools.build.lib.util.Preconditions;
import java.util.ArrayList;
@@ -46,7 +46,8 @@
static final int MAYBE_CHECK_THRESHOLD = 10;
- private static final Interner<KeyToConsolidate> consolidateInterner = Interners.newWeakInterner();
+ private static final Interner<KeyToConsolidate> consolidateInterner =
+ BlazeInterners.newWeakInterner();
abstract void setReverseDepsObject(T container, Object object);
diff --git a/src/main/java/com/google/devtools/build/skyframe/SkyKey.java b/src/main/java/com/google/devtools/build/skyframe/SkyKey.java
index f2355e1..0af8b82 100644
--- a/src/main/java/com/google/devtools/build/skyframe/SkyKey.java
+++ b/src/main/java/com/google/devtools/build/skyframe/SkyKey.java
@@ -15,7 +15,7 @@
import com.google.common.base.Function;
import com.google.common.collect.Interner;
-import com.google.common.collect.Interners;
+import com.google.devtools.build.lib.concurrent.BlazeInterners;
import com.google.devtools.build.lib.util.Preconditions;
import java.io.Serializable;
@@ -24,7 +24,7 @@
* A {@link SkyKey} is effectively a pair (type, name) that identifies a Skyframe value.
*/
public final class SkyKey implements Serializable {
- private static final Interner<SkyKey> SKY_KEY_INTERNER = Interners.newWeakInterner();
+ private static final Interner<SkyKey> SKY_KEY_INTERNER = BlazeInterners.newWeakInterner();
private final SkyFunctionName functionName;