aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/skyframe
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/skyframe
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/skyframe')
-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
8 files changed, 64 insertions, 13 deletions
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;
+ }
+}