From 3895dc0fea3572e72195f7fe8298347a34d24f89 Mon Sep 17 00:00:00 2001 From: Michajlo Matijkiw Date: Mon, 17 Aug 2015 14:19:44 +0000 Subject: Memoize RepositoryNames The unique names are generally limited. -- MOS_MIGRATED_REVID=100821922 --- .../build/lib/packages/PackageIdentifier.java | 35 +++++++++++++++++----- 1 file changed, 28 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/main/java/com/google/devtools/build/lib/packages/PackageIdentifier.java b/src/main/java/com/google/devtools/build/lib/packages/PackageIdentifier.java index e6883506d2..5a37107a29 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/PackageIdentifier.java +++ b/src/main/java/com/google/devtools/build/lib/packages/PackageIdentifier.java @@ -15,6 +15,10 @@ package com.google.devtools.build.lib.packages; import com.google.common.base.Preconditions; +import com.google.common.base.Throwables; +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; import com.google.common.collect.ComparisonChain; import com.google.devtools.build.lib.cmdline.LabelValidator; import com.google.devtools.build.lib.syntax.Label.SyntaxException; @@ -29,6 +33,7 @@ import java.io.ObjectOutputStream; import java.io.ObjectStreamException; import java.io.Serializable; import java.util.Objects; +import java.util.concurrent.ExecutionException; import javax.annotation.concurrent.Immutable; @@ -46,22 +51,38 @@ public final class PackageIdentifier implements Comparable, S * A human-readable name for the repository. */ public static final class RepositoryName { - private final String name; + private static final LoadingCache repositoryNameCache = + CacheBuilder.newBuilder() + .weakValues() + .build( + new CacheLoader () { + @Override + public RepositoryName load(String name) throws SyntaxException { + String errorMessage = validate(name); + if (errorMessage != null) { + errorMessage = "invalid repository name '" + + StringUtilities.sanitizeControlChars(name) + "': " + errorMessage; + throw new SyntaxException(errorMessage); + } + return new RepositoryName(StringCanonicalizer.intern(name)); + } + }); /** * Makes sure that name is a valid repository name and creates a new RepositoryName using it. * @throws SyntaxException if the name is invalid. */ public static RepositoryName create(String name) throws SyntaxException { - String errorMessage = validate(name); - if (errorMessage != null) { - errorMessage = "invalid repository name '" - + StringUtilities.sanitizeControlChars(name) + "': " + errorMessage; - throw new SyntaxException(errorMessage); + try { + return repositoryNameCache.get(name); + } catch (ExecutionException e) { + Throwables.propagateIfInstanceOf(e.getCause(), SyntaxException.class); + throw new IllegalStateException("Failed to create RepositoryName from " + name, e); } - return new RepositoryName(StringCanonicalizer.intern(name)); } + private final String name; + private RepositoryName(String name) { this.name = name; } -- cgit v1.2.3