diff options
author | michajlo <michajlo@google.com> | 2017-10-07 19:44:43 +0200 |
---|---|---|
committer | Klaus Aehlig <aehlig@google.com> | 2017-10-09 08:16:06 +0200 |
commit | b45d5f536048db0e568e16417f4fb1d50f01e1ac (patch) | |
tree | f4fcdf655a25321234f8b19846c75735eb5c1126 /src/main/java/com/google/devtools/build/lib/skyframe | |
parent | 11be883a0aef677799721e60d2c44202cecae6ce (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/BUILD | 2 | ||||
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/skyframe/serialization/LabelCodec.java | 3 | ||||
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/skyframe/serialization/PathCodec.java | 6 | ||||
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/skyframe/serialization/PathFragmentCodec.java | 9 | ||||
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/skyframe/serialization/SerializationCommonUtils.java | 3 | ||||
-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.java | 43 |
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; + } +} |