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;