aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib
diff options
context:
space:
mode:
authorGravatar michajlo <michajlo@google.com>2017-10-07 19:44:43 +0200
committerGravatar Klaus Aehlig <aehlig@google.com>2017-10-09 08:16:06 +0200
commitb45d5f536048db0e568e16417f4fb1d50f01e1ac (patch)
treef4fcdf655a25321234f8b19846c75735eb5c1126 /src/main/java/com/google/devtools/build/lib
parent11be883a0aef677799721e60d2c44202cecae6ce (diff)
Consolidate ObjectCodec<String> creation
Opens the door to swapping in different implementations without needing to touch a ton of code. RELNOTES: None PiperOrigin-RevId: 171412555
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib')
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectories.java12
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectoriesCodec.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/ServerDirectories.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/apple/AppleCommandLineOptions.java18
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/apple/AppleConfiguration.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/serialization/BUILD2
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/serialization/LabelCodec.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/serialization/PathCodec.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/serialization/PathFragmentCodec.java9
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/serialization/SerializationCommonUtils.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/serialization/strings/FastStringCodec.java (renamed from src/main/java/com/google/devtools/build/lib/skyframe/serialization/FastStringCodec.java)6
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/serialization/strings/StringCodec.java (renamed from src/main/java/com/google/devtools/build/lib/skyframe/serialization/StringCodec.java)5
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/serialization/strings/StringCodecs.java43
13 files changed, 91 insertions, 33 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectories.java b/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectories.java
index 7995681706..60071469f5 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectories.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectories.java
@@ -18,8 +18,9 @@ import com.google.common.annotations.VisibleForTesting;
import com.google.common.hash.HashCode;
import com.google.devtools.build.lib.actions.Root;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
-import com.google.devtools.build.lib.skyframe.serialization.FastStringCodec;
import com.google.devtools.build.lib.skyframe.serialization.PathCodec;
+import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
+import com.google.devtools.build.lib.skyframe.serialization.strings.StringCodecs;
import com.google.devtools.build.lib.util.StringCanonicalizer;
import com.google.devtools.build.lib.vfs.FileSystem;
import com.google.devtools.build.lib.vfs.Path;
@@ -243,17 +244,18 @@ public final class BlazeDirectories {
&& this.execRoot.equals(that.execRoot);
}
- void serialize(CodedOutputStream codedOut, PathCodec pathCodec) throws IOException {
+ void serialize(CodedOutputStream codedOut, PathCodec pathCodec)
+ throws IOException, SerializationException {
serverDirectories.serialize(codedOut, pathCodec);
pathCodec.serialize(workspace, codedOut);
- FastStringCodec.INSTANCE.serialize(productName, codedOut);
+ StringCodecs.asciiOptimized().serialize(productName, codedOut);
}
static BlazeDirectories deserialize(CodedInputStream codedIn, PathCodec pathCodec)
- throws IOException {
+ throws IOException, SerializationException {
return new BlazeDirectories(
ServerDirectories.deserialize(codedIn, pathCodec),
pathCodec.deserialize(codedIn),
- FastStringCodec.INSTANCE.deserialize(codedIn));
+ StringCodecs.asciiOptimized().deserialize(codedIn));
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectoriesCodec.java b/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectoriesCodec.java
index 61c3ff66be..3b62084a68 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectoriesCodec.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectoriesCodec.java
@@ -16,6 +16,7 @@ package com.google.devtools.build.lib.analysis;
import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
import com.google.devtools.build.lib.skyframe.serialization.PathCodec;
+import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
import com.google.protobuf.CodedInputStream;
import com.google.protobuf.CodedOutputStream;
import java.io.IOException;
@@ -37,12 +38,14 @@ public class BlazeDirectoriesCodec implements ObjectCodec<BlazeDirectories> {
}
@Override
- public void serialize(BlazeDirectories obj, CodedOutputStream codedOut) throws IOException {
+ public void serialize(BlazeDirectories obj, CodedOutputStream codedOut)
+ throws IOException, SerializationException {
obj.serialize(codedOut, pathCodec);
}
@Override
- public BlazeDirectories deserialize(CodedInputStream codedIn) throws IOException {
+ public BlazeDirectories deserialize(CodedInputStream codedIn)
+ throws IOException, SerializationException {
return BlazeDirectories.deserialize(codedIn, pathCodec);
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ServerDirectories.java b/src/main/java/com/google/devtools/build/lib/analysis/ServerDirectories.java
index 8c75f583d8..48a05c9a9a 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ServerDirectories.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ServerDirectories.java
@@ -19,6 +19,7 @@ import com.google.common.hash.HashCode;
import com.google.common.hash.Hashing;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
import com.google.devtools.build.lib.skyframe.serialization.PathCodec;
+import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
import com.google.devtools.build.lib.util.Preconditions;
import com.google.devtools.build.lib.vfs.FileSystem;
import com.google.devtools.build.lib.vfs.Path;
@@ -125,7 +126,8 @@ public final class ServerDirectories {
&& this.outputBase.equals(that.outputBase);
}
- void serialize(CodedOutputStream out, PathCodec pathCodec) throws IOException {
+ void serialize(CodedOutputStream out, PathCodec pathCodec)
+ throws IOException, SerializationException {
pathCodec.serialize(installBase, out);
out.writeBoolNoTag(installMD5 != null);
if (installMD5 != null) {
@@ -135,7 +137,7 @@ public final class ServerDirectories {
}
static ServerDirectories deserialize(CodedInputStream in, PathCodec pathCodec)
- throws IOException {
+ throws IOException, SerializationException {
Path installBase = pathCodec.deserialize(in);
HashCode installMd5 = null;
if (in.readBool()) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/AppleCommandLineOptions.java b/src/main/java/com/google/devtools/build/lib/rules/apple/AppleCommandLineOptions.java
index f9bc78b799..71c8508f65 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/apple/AppleCommandLineOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/apple/AppleCommandLineOptions.java
@@ -29,9 +29,9 @@ import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
import com.google.devtools.build.lib.rules.apple.AppleConfiguration.ConfigurationDistinguisher;
import com.google.devtools.build.lib.rules.apple.ApplePlatform.PlatformType;
import com.google.devtools.build.lib.skyframe.serialization.EnumCodec;
-import com.google.devtools.build.lib.skyframe.serialization.FastStringCodec;
import com.google.devtools.build.lib.skyframe.serialization.LabelCodec;
import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
+import com.google.devtools.build.lib.skyframe.serialization.strings.StringCodecs;
import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
import com.google.devtools.build.lib.skylarkinterface.SkylarkPrinter;
@@ -517,7 +517,7 @@ public class AppleCommandLineOptions extends FragmentOptions {
void serialize(CodedOutputStream out) throws IOException, SerializationException {
out.writeBoolNoTag(mandatoryMinimumVersion);
out.writeBoolNoTag(objcProviderFromLinked);
- serializeNullable(xcodeVersion, out, FastStringCodec.INSTANCE);
+ serializeNullable(xcodeVersion, out, StringCodecs.asciiOptimized());
serializeNullable(iosSdkVersion, out, DottedVersion.CODEC);
serializeNullable(watchOsSdkVersion, out, DottedVersion.CODEC);
serializeNullable(tvOsSdkVersion, out, DottedVersion.CODEC);
@@ -526,10 +526,10 @@ public class AppleCommandLineOptions extends FragmentOptions {
serializeNullable(watchosMinimumOs, out, DottedVersion.CODEC);
serializeNullable(tvosMinimumOs, out, DottedVersion.CODEC);
serializeNullable(macosMinimumOs, out, DottedVersion.CODEC);
- FastStringCodec.INSTANCE.serialize(iosCpu, out);
+ StringCodecs.asciiOptimized().serialize(iosCpu, out);
LabelCodec.INSTANCE.serialize(appleCrosstoolTop, out);
PlatformType.CODEC.serialize(applePlatformType, out);
- FastStringCodec.INSTANCE.serialize(appleSplitCpu, out);
+ StringCodecs.asciiOptimized().serialize(appleSplitCpu, out);
ConfigurationDistinguisher.CODEC.serialize(configurationDistinguisher, out);
STRING_LIST_CODEC.serialize((ImmutableList<String>) iosMultiCpus, out);
STRING_LIST_CODEC.serialize((ImmutableList<String>) watchosCpus, out);
@@ -537,7 +537,7 @@ public class AppleCommandLineOptions extends FragmentOptions {
STRING_LIST_CODEC.serialize((ImmutableList<String>) macosCpus, out);
LabelCodec.INSTANCE.serialize(defaultProvisioningProfile, out);
LabelCodec.INSTANCE.serialize(xcodeVersionConfig, out);
- serializeNullable(xcodeToolchain, out, FastStringCodec.INSTANCE);
+ serializeNullable(xcodeToolchain, out, StringCodecs.asciiOptimized());
AppleBitcodeMode.CODEC.serialize(appleBitcodeMode, out);
out.writeBoolNoTag(enableAppleCrosstoolTransition);
out.writeBoolNoTag(targetUsesAppleCrosstool);
@@ -548,7 +548,7 @@ public class AppleCommandLineOptions extends FragmentOptions {
AppleCommandLineOptions result = new AppleCommandLineOptions();
result.mandatoryMinimumVersion = in.readBool();
result.objcProviderFromLinked = in.readBool();
- result.xcodeVersion = deserializeNullable(in, FastStringCodec.INSTANCE);
+ result.xcodeVersion = deserializeNullable(in, StringCodecs.asciiOptimized());
result.iosSdkVersion = deserializeNullable(in, DottedVersion.CODEC);
result.watchOsSdkVersion = deserializeNullable(in, DottedVersion.CODEC);
result.tvOsSdkVersion = deserializeNullable(in, DottedVersion.CODEC);
@@ -557,10 +557,10 @@ public class AppleCommandLineOptions extends FragmentOptions {
result.watchosMinimumOs = deserializeNullable(in, DottedVersion.CODEC);
result.tvosMinimumOs = deserializeNullable(in, DottedVersion.CODEC);
result.macosMinimumOs = deserializeNullable(in, DottedVersion.CODEC);
- result.iosCpu = FastStringCodec.INSTANCE.deserialize(in);
+ result.iosCpu = StringCodecs.asciiOptimized().deserialize(in);
result.appleCrosstoolTop = LabelCodec.INSTANCE.deserialize(in);
result.applePlatformType = PlatformType.CODEC.deserialize(in);
- result.appleSplitCpu = FastStringCodec.INSTANCE.deserialize(in);
+ result.appleSplitCpu = StringCodecs.asciiOptimized().deserialize(in);
result.configurationDistinguisher = ConfigurationDistinguisher.CODEC.deserialize(in);
result.iosMultiCpus = STRING_LIST_CODEC.deserialize(in);
result.watchosCpus = STRING_LIST_CODEC.deserialize(in);
@@ -568,7 +568,7 @@ public class AppleCommandLineOptions extends FragmentOptions {
result.macosCpus = STRING_LIST_CODEC.deserialize(in);
result.defaultProvisioningProfile = LabelCodec.INSTANCE.deserialize(in);
result.xcodeVersionConfig = LabelCodec.INSTANCE.deserialize(in);
- result.xcodeToolchain = deserializeNullable(in, FastStringCodec.INSTANCE);
+ result.xcodeToolchain = deserializeNullable(in, StringCodecs.asciiOptimized());
result.appleBitcodeMode = AppleBitcodeMode.CODEC.deserialize(in);
result.enableAppleCrosstoolTransition = in.readBool();
result.targetUsesAppleCrosstool = in.readBool();
diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/AppleConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/apple/AppleConfiguration.java
index 72b9e9a3bf..442408bede 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/apple/AppleConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/apple/AppleConfiguration.java
@@ -35,8 +35,8 @@ import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
import com.google.devtools.build.lib.rules.apple.AppleCommandLineOptions.AppleBitcodeMode;
import com.google.devtools.build.lib.rules.apple.ApplePlatform.PlatformType;
import com.google.devtools.build.lib.skyframe.serialization.EnumCodec;
-import com.google.devtools.build.lib.skyframe.serialization.FastStringCodec;
import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
+import com.google.devtools.build.lib.skyframe.serialization.strings.StringCodecs;
import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
@@ -740,7 +740,7 @@ public class AppleConfiguration extends BuildConfiguration.Fragment {
static AppleConfiguration deserialize(CodedInputStream in)
throws IOException, SerializationException {
AppleCommandLineOptions options = AppleCommandLineOptions.deserialize(in);
- String iosCpu = FastStringCodec.INSTANCE.deserialize(in);
+ String iosCpu = StringCodecs.asciiOptimized().deserialize(in);
DottedVersion xcodeVersion = deserializeNullable(in, DottedVersion.CODEC);
return new AppleConfiguration(
options,
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/BUILD b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/BUILD
index 45e652f460..331278f7a6 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/BUILD
@@ -9,7 +9,7 @@ filegroup(
java_library(
name = "serialization",
- srcs = glob(["*.java"]),
+ srcs = glob(["**/*.java"]),
deps = [
"//src/main/java/com/google/devtools/build/lib:preconditions",
"//src/main/java/com/google/devtools/build/lib/cmdline",
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/LabelCodec.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/LabelCodec.java
index 6f8881dfef..89978baa67 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/LabelCodec.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/LabelCodec.java
@@ -16,6 +16,7 @@ package com.google.devtools.build.lib.skyframe.serialization;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.cmdline.PackageIdentifier;
+import com.google.devtools.build.lib.skyframe.serialization.strings.StringCodecs;
import com.google.protobuf.CodedInputStream;
import com.google.protobuf.CodedOutputStream;
import java.io.IOException;
@@ -26,7 +27,7 @@ public class LabelCodec implements ObjectCodec<Label> {
// TODO(michajlo): Share single instance of package id codec among all the codecs.
private final PackageIdentifierCodec packageIdCodec = new PackageIdentifierCodec();
- private final ObjectCodec<String> stringCodec = new FastStringCodec();
+ private final ObjectCodec<String> stringCodec = StringCodecs.asciiOptimized();
@Override
public Class<Label> getEncodedClass() {
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/PathCodec.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/PathCodec.java
index 4aca0b07ed..38fb13d7e5 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/PathCodec.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/PathCodec.java
@@ -40,7 +40,8 @@ public class PathCodec implements ObjectCodec<Path> {
}
@Override
- public void serialize(Path path, CodedOutputStream codedOut) throws IOException {
+ public void serialize(Path path, CodedOutputStream codedOut)
+ throws IOException, SerializationException {
Preconditions.checkState(
path.getFileSystem() == fileSystem,
"Path's FileSystem (%s) did not match the configured FileSystem (%s)",
@@ -50,7 +51,8 @@ public class PathCodec implements ObjectCodec<Path> {
}
@Override
- public Path deserialize(CodedInputStream codedIn) throws IOException {
+ public Path deserialize(CodedInputStream codedIn)
+ throws IOException, SerializationException {
PathFragment pathFragment = pathFragmentCodec.deserialize(codedIn);
return fileSystem.getPath(pathFragment);
}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/PathFragmentCodec.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/PathFragmentCodec.java
index 8cd06f2249..a2f9e25955 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/PathFragmentCodec.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/PathFragmentCodec.java
@@ -14,6 +14,7 @@
package com.google.devtools.build.lib.skyframe.serialization;
+import com.google.devtools.build.lib.skyframe.serialization.strings.StringCodecs;
import com.google.devtools.build.lib.vfs.PathFragment;
import com.google.protobuf.CodedInputStream;
import com.google.protobuf.CodedOutputStream;
@@ -22,7 +23,7 @@ import java.io.IOException;
/** Custom serialization for {@link PathFragment}s. */
class PathFragmentCodec implements ObjectCodec<PathFragment> {
- private final FastStringCodec stringCodec = new FastStringCodec();
+ private final ObjectCodec<String> stringCodec = StringCodecs.asciiOptimized();
@Override
public Class<PathFragment> getEncodedClass() {
@@ -30,7 +31,8 @@ class PathFragmentCodec implements ObjectCodec<PathFragment> {
}
@Override
- public void serialize(PathFragment pathFragment, CodedOutputStream codedOut) throws IOException {
+ public void serialize(PathFragment pathFragment, CodedOutputStream codedOut)
+ throws IOException, SerializationException {
codedOut.writeInt32NoTag(pathFragment.getDriveLetter());
codedOut.writeBoolNoTag(pathFragment.isAbsolute());
codedOut.writeInt32NoTag(pathFragment.segmentCount());
@@ -40,7 +42,8 @@ class PathFragmentCodec implements ObjectCodec<PathFragment> {
}
@Override
- public PathFragment deserialize(CodedInputStream codedIn) throws IOException {
+ public PathFragment deserialize(CodedInputStream codedIn)
+ throws IOException, SerializationException {
char driveLetter = (char) codedIn.readInt32();
boolean isAbsolute = codedIn.readBool();
int segmentCount = codedIn.readInt32();
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SerializationCommonUtils.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SerializationCommonUtils.java
index 5efea4b5cd..85abc95e17 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SerializationCommonUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SerializationCommonUtils.java
@@ -16,6 +16,7 @@ package com.google.devtools.build.lib.skyframe.serialization;
import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
import com.google.devtools.build.lib.cmdline.RepositoryName;
+import com.google.devtools.build.lib.skyframe.serialization.strings.StringCodecs;
import com.google.protobuf.ByteString;
import com.google.protobuf.CodedInputStream;
import com.google.protobuf.CodedOutputStream;
@@ -24,7 +25,7 @@ import java.io.IOException;
/** Common utilities for serialization. */
public class SerializationCommonUtils {
public static final ImmutableListCodec<String> STRING_LIST_CODEC =
- new ImmutableListCodec<>(FastStringCodec.INSTANCE);
+ new ImmutableListCodec<>(StringCodecs.asciiOptimized());
private static final ByteString DEFAULT_REPOSITORY =
ByteString.copyFromUtf8(RepositoryName.DEFAULT.getName());
private static final ByteString MAIN_REPOSITORY =
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/FastStringCodec.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/strings/FastStringCodec.java
index 23bf38baae..e763f70b50 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/FastStringCodec.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/strings/FastStringCodec.java
@@ -12,8 +12,9 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package com.google.devtools.build.lib.skyframe.serialization;
+package com.google.devtools.build.lib.skyframe.serialization.strings;
+import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
import com.google.protobuf.CodedInputStream;
import com.google.protobuf.CodedOutputStream;
import java.io.IOException;
@@ -29,8 +30,7 @@ import sun.misc.Unsafe;
* still handle UTF-8, though less efficiently than {@link StringCodec}. Should be used when the
* majority of the data passing through will be ascii.
*/
-public class FastStringCodec implements ObjectCodec<String> {
- public static final FastStringCodec INSTANCE = new FastStringCodec();
+class FastStringCodec implements ObjectCodec<String> {
private static final Unsafe theUnsafe;
private static final long STRING_VALUE_OFFSET;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/StringCodec.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/strings/StringCodec.java
index 4b1bc70b7b..8aaba608cc 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/StringCodec.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/strings/StringCodec.java
@@ -12,14 +12,15 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package com.google.devtools.build.lib.skyframe.serialization;
+package com.google.devtools.build.lib.skyframe.serialization.strings;
+import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
import com.google.protobuf.CodedInputStream;
import com.google.protobuf.CodedOutputStream;
import java.io.IOException;
/** Dead-simple serialization for {@link String}s. */
-public class StringCodec implements ObjectCodec<String> {
+class StringCodec implements ObjectCodec<String> {
@Override
public Class<String> getEncodedClass() {
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/strings/StringCodecs.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/strings/StringCodecs.java
new file mode 100644
index 0000000000..24f36ecb07
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/strings/StringCodecs.java
@@ -0,0 +1,43 @@
+// Copyright 2017 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.skyframe.serialization.strings;
+
+import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
+
+/** Utility for accessing (potentially platform-specific) {@link String} {@link ObjectCodec}s. */
+public final class StringCodecs {
+
+ private static final FastStringCodec fastStringCodec = new FastStringCodec();
+ private static final StringCodec stringCodec = new StringCodec();
+
+ private StringCodecs() {}
+
+ /**
+ * Returns singleton instance optimized for almost-always ASCII data. This instance can still
+ * serialize/deserialize UTF-8 data, but with potentially worse performance than
+ * {@link #simple()}.
+ */
+ public static ObjectCodec<String> asciiOptimized() {
+ return fastStringCodec;
+ }
+
+ /**
+ * Returns singleton instance of basic implementation. Should be preferred over
+ * {@link #asciiOptimized()} when a sufficient amount of UTF-8 data is expected.
+ */
+ public static ObjectCodec<String> simple() {
+ return stringCodec;
+ }
+}