diff options
author | janakr <janakr@google.com> | 2018-01-24 10:15:56 -0800 |
---|---|---|
committer | Copybara-Service <copybara-piper@google.com> | 2018-01-24 10:17:58 -0800 |
commit | 269d9bd849938af49a30950522bec9e1140cf599 (patch) | |
tree | ab253fd7b188014998ba3762f88557a7a6485035 /src/main/java | |
parent | eb5e3ccaa1dccb6b3a77427be0f1b4d48012c069 (diff) |
Add codecs for SkyKeys that are needed for null build.
PiperOrigin-RevId: 183102476
Diffstat (limited to 'src/main/java')
4 files changed, 77 insertions, 13 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/pkgcache/TestFilter.java b/src/main/java/com/google/devtools/build/lib/pkgcache/TestFilter.java index 5dbed752e7..56e8e8e616 100644 --- a/src/main/java/com/google/devtools/build/lib/pkgcache/TestFilter.java +++ b/src/main/java/com/google/devtools/build/lib/pkgcache/TestFilter.java @@ -39,7 +39,7 @@ import javax.annotation.Nullable; */ @AutoCodec public final class TestFilter implements com.google.common.base.Predicate<Target> { - static final ObjectCodec<TestFilter> CODEC = new TestFilter_AutoCodec(); + public static final ObjectCodec<TestFilter> CODEC = new TestFilter_AutoCodec(); private static final Predicate<Target> ALWAYS_TRUE = (t) -> true; diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationValue.java index df86614495..da75352d25 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationValue.java @@ -25,6 +25,7 @@ import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodec import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec; import com.google.devtools.build.lib.skyframe.serialization.SerializationException; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization; import com.google.devtools.build.lib.skyframe.serialization.strings.StringCodecs; import com.google.devtools.build.lib.vfs.FileSystemProvider; import com.google.devtools.build.skyframe.SkyFunctionName; @@ -77,7 +78,11 @@ public class BuildConfigurationValue implements SkyValue { return keyInterner.intern(new Key(fragmentClassSet, buildOptions)); } - static final class Key implements SkyKey, Serializable { + /** {@link SkyKey} for {@link BuildConfigurationValue}. */ + @VisibleForSerialization + public static final class Key implements SkyKey, Serializable { + public static final ObjectCodec<Key> CODEC = new Codec(); + private final FragmentClassSet fragments; private final BuildOptions buildOptions; // If hashCode really is -1, we'll recompute it from scratch each time. Oh well. diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ConfigurationFragmentValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/ConfigurationFragmentValue.java index 4a59bb4209..6fd58f605e 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/ConfigurationFragmentValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/ConfigurationFragmentValue.java @@ -15,17 +15,24 @@ package com.google.devtools.build.lib.skyframe; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; +import com.google.common.collect.Interner; import com.google.devtools.build.lib.analysis.config.BuildConfiguration; import com.google.devtools.build.lib.analysis.config.BuildConfiguration.Fragment; import com.google.devtools.build.lib.analysis.config.BuildOptions; +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.packages.RuleClassProvider; +import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec; +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.Fingerprint; -import com.google.devtools.build.skyframe.LegacySkyKey; +import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; -import java.io.Serializable; +import com.google.protobuf.CodedInputStream; +import com.google.protobuf.CodedOutputStream; +import java.io.IOException; import java.util.Objects; import javax.annotation.Nullable; @@ -48,30 +55,40 @@ public class ConfigurationFragmentValue implements SkyValue { } @ThreadSafe - public static SkyKey key(BuildOptions buildOptions, Class<? extends Fragment> fragmentType, + public static ConfigurationFragmentKey key( + BuildOptions buildOptions, + Class<? extends Fragment> fragmentType, RuleClassProvider ruleClassProvider) { BuildOptions optionsKey = buildOptions.trim( BuildConfiguration.getOptionsClasses( ImmutableList.<Class<? extends BuildConfiguration.Fragment>>of(fragmentType), ruleClassProvider)); - return LegacySkyKey.create( - SkyFunctions.CONFIGURATION_FRAGMENT, - new ConfigurationFragmentKey(optionsKey, fragmentType)); + return ConfigurationFragmentKey.of(optionsKey, fragmentType); } - static final class ConfigurationFragmentKey implements Serializable { + /** {@link SkyKey} for {@link ConfigurationFragmentValue}. */ + public static final class ConfigurationFragmentKey implements SkyKey { + private static Interner<ConfigurationFragmentKey> interner = BlazeInterners.newWeakInterner(); + + public static final ObjectCodec<ConfigurationFragmentKey> CODEC = new Codec(); + private final BuildOptions buildOptions; private final String checksum; private final Class<? extends Fragment> fragmentType; - public ConfigurationFragmentKey(BuildOptions buildOptions, - Class<? extends Fragment> fragmentType) { + private ConfigurationFragmentKey( + BuildOptions buildOptions, Class<? extends Fragment> fragmentType) { this.buildOptions = Preconditions.checkNotNull(buildOptions); this.checksum = Fingerprint.md5Digest(buildOptions.computeCacheKey()); this.fragmentType = Preconditions.checkNotNull(fragmentType); } + private static ConfigurationFragmentKey of( + BuildOptions buildOptions, Class<? extends Fragment> fragmentType) { + return interner.intern(new ConfigurationFragmentKey(buildOptions, fragmentType)); + } + public BuildOptions getBuildOptions() { return buildOptions; } @@ -103,5 +120,39 @@ public class ConfigurationFragmentValue implements SkyValue { return String.format("ConfigurationFragmentKey(class=%s, checksum=%s)", fragmentType.getName(), checksum); } + + @Override + public SkyFunctionName functionName() { + return SkyFunctions.CONFIGURATION_FRAGMENT; + } + + private static class Codec implements ObjectCodec<ConfigurationFragmentKey> { + @Override + public Class<ConfigurationFragmentKey> getEncodedClass() { + return ConfigurationFragmentKey.class; + } + + @Override + public void serialize(ConfigurationFragmentKey obj, CodedOutputStream codedOut) + throws SerializationException, IOException { + BuildOptions.CODEC.serialize(obj.buildOptions, codedOut); + StringCodecs.asciiOptimized().serialize(obj.fragmentType.getName(), codedOut); + } + + @SuppressWarnings("unchecked") // Cast to Class<? extends Fragment>. + @Override + public ConfigurationFragmentKey deserialize(CodedInputStream codedIn) + throws SerializationException, IOException { + + try { + return of( + BuildOptions.CODEC.deserialize(codedIn), + (Class<? extends Fragment>) + Class.forName(StringCodecs.asciiOptimized().deserialize(codedIn))); + } catch (ClassNotFoundException e) { + throw new SerializationException("Couldn't deserialize ConfigurationFragmentKey", e); + } + } + } } } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternPhaseValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternPhaseValue.java index 21635b53aa..cc7e84db78 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternPhaseValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternPhaseValue.java @@ -23,6 +23,9 @@ import com.google.devtools.build.lib.packages.Target; import com.google.devtools.build.lib.pkgcache.LoadingResult; import com.google.devtools.build.lib.pkgcache.TestFilter; import com.google.devtools.build.lib.skyframe.serialization.NotSerializableRuntimeException; +import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization; import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; @@ -152,7 +155,12 @@ public final class TargetPatternPhaseValue implements SkyValue { /** The configuration needed to run the target pattern evaluation phase. */ @ThreadSafe - static final class TargetPatternPhaseKey implements SkyKey, Serializable { + @VisibleForSerialization + @AutoCodec + public static final class TargetPatternPhaseKey implements SkyKey, Serializable { + public static final ObjectCodec<TargetPatternPhaseKey> CODEC = + new TargetPatternPhaseValue_TargetPatternPhaseKey_AutoCodec(); + private final ImmutableList<String> targetPatterns; private final String offset; private final boolean compileOneDependency; @@ -163,7 +171,7 @@ public final class TargetPatternPhaseValue implements SkyValue { private final boolean expandTestSuites; @Nullable private final TestFilter testFilter; - public TargetPatternPhaseKey( + TargetPatternPhaseKey( ImmutableList<String> targetPatterns, String offset, boolean compileOneDependency, |