diff options
author | 2018-03-05 16:19:35 -0800 | |
---|---|---|
committer | 2018-03-05 16:21:48 -0800 | |
commit | 7ba939dfd5df48903929e9c14ebd0449656403e4 (patch) | |
tree | 7114864d102195cc734b3f77ddbbcf1dcd2d51f1 /src/main/java/com/google/devtools/build/skyframe | |
parent | d2cf5cab8390c8057d8240bce8abdd61d6e1d916 (diff) |
Cache SkylarkLookupImportValues in memory so that we don't recompute them multiple times.
PiperOrigin-RevId: 187941859
Diffstat (limited to 'src/main/java/com/google/devtools/build/skyframe')
-rw-r--r-- | src/main/java/com/google/devtools/build/skyframe/RecordingSkyFunctionEnvironment.java | 223 |
1 files changed, 223 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/skyframe/RecordingSkyFunctionEnvironment.java b/src/main/java/com/google/devtools/build/skyframe/RecordingSkyFunctionEnvironment.java new file mode 100644 index 0000000000..16b6c3fa23 --- /dev/null +++ b/src/main/java/com/google/devtools/build/skyframe/RecordingSkyFunctionEnvironment.java @@ -0,0 +1,223 @@ +// Copyright 2018 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.skyframe; + +import com.google.devtools.build.lib.events.ExtendedEventHandler; +import com.google.devtools.build.lib.util.GroupedList; +import com.google.devtools.build.skyframe.SkyFunction.Environment; +import java.util.Map; +import java.util.function.Consumer; +import javax.annotation.Nullable; + +/** An environment that can observe the deps requested through getValue(s) calls. */ +public class RecordingSkyFunctionEnvironment implements Environment { + + private final Environment delegate; + private final Consumer<SkyKey> skyKeyReceiver; + private final Consumer<Iterable<SkyKey>> skyKeysReceiver; + + public RecordingSkyFunctionEnvironment( + Environment delegate, + Consumer<SkyKey> skyKeyReceiver, + Consumer<Iterable<SkyKey>> skyKeysReceiver) { + this.delegate = delegate; + this.skyKeyReceiver = skyKeyReceiver; + this.skyKeysReceiver = skyKeysReceiver; + } + + private void recordDep(SkyKey key) { + skyKeyReceiver.accept(key); + } + + @SuppressWarnings("unchecked") // Cast Iterable<? extends SkyKey> to Iterable<SkyKey>. + private void recordDeps(Iterable<? extends SkyKey> keys) { + skyKeysReceiver.accept((Iterable<SkyKey>) keys); + } + + public Environment getDelegate() { + return delegate; + } + + @Nullable + @Override + public SkyValue getValue(SkyKey valueName) throws InterruptedException { + recordDep(valueName); + return delegate.getValue(valueName); + } + + @Nullable + @Override + public <E extends Exception> SkyValue getValueOrThrow(SkyKey depKey, Class<E> exceptionClass) + throws E, InterruptedException { + recordDep(depKey); + return delegate.getValueOrThrow(depKey, exceptionClass); + } + + @Nullable + @Override + public <E1 extends Exception, E2 extends Exception> SkyValue getValueOrThrow( + SkyKey depKey, Class<E1> exceptionClass1, Class<E2> exceptionClass2) + throws E1, E2, InterruptedException { + recordDep(depKey); + return delegate.getValueOrThrow(depKey, exceptionClass1, exceptionClass2); + } + + @Nullable + @Override + public <E1 extends Exception, E2 extends Exception, E3 extends Exception> + SkyValue getValueOrThrow( + SkyKey depKey, + Class<E1> exceptionClass1, + Class<E2> exceptionClass2, + Class<E3> exceptionClass3) + throws E1, E2, E3, InterruptedException { + recordDep(depKey); + return delegate.getValueOrThrow(depKey, exceptionClass1, exceptionClass2, exceptionClass3); + } + + @Nullable + @Override + public <E1 extends Exception, E2 extends Exception, E3 extends Exception, E4 extends Exception> + SkyValue getValueOrThrow( + SkyKey depKey, + Class<E1> exceptionClass1, + Class<E2> exceptionClass2, + Class<E3> exceptionClass3, + Class<E4> exceptionClass4) + throws E1, E2, E3, E4, InterruptedException { + recordDep(depKey); + return delegate.getValueOrThrow( + depKey, exceptionClass1, exceptionClass2, exceptionClass3, exceptionClass4); + } + + @Nullable + @Override + public < + E1 extends Exception, + E2 extends Exception, + E3 extends Exception, + E4 extends Exception, + E5 extends Exception> + SkyValue getValueOrThrow( + SkyKey depKey, + Class<E1> exceptionClass1, + Class<E2> exceptionClass2, + Class<E3> exceptionClass3, + Class<E4> exceptionClass4, + Class<E5> exceptionClass5) + throws E1, E2, E3, E4, E5, InterruptedException { + recordDep(depKey); + return delegate.getValueOrThrow( + depKey, + exceptionClass1, + exceptionClass2, + exceptionClass3, + exceptionClass4, + exceptionClass5); + } + + @Override + public Map<SkyKey, SkyValue> getValues(Iterable<SkyKey> depKeys) throws InterruptedException { + recordDeps(depKeys); + return delegate.getValues(depKeys); + } + + @Override + public <E extends Exception> Map<SkyKey, ValueOrException<E>> getValuesOrThrow( + Iterable<? extends SkyKey> depKeys, Class<E> exceptionClass) throws InterruptedException { + recordDeps(depKeys); + return delegate.getValuesOrThrow(depKeys, exceptionClass); + } + + @Override + public <E1 extends Exception, E2 extends Exception> + Map<SkyKey, ValueOrException2<E1, E2>> getValuesOrThrow( + Iterable<? extends SkyKey> depKeys, Class<E1> exceptionClass1, Class<E2> exceptionClass2) + throws InterruptedException { + recordDeps(depKeys); + return delegate.getValuesOrThrow(depKeys, exceptionClass1, exceptionClass2); + } + + @Override + public <E1 extends Exception, E2 extends Exception, E3 extends Exception> + Map<SkyKey, ValueOrException3<E1, E2, E3>> getValuesOrThrow( + Iterable<? extends SkyKey> depKeys, + Class<E1> exceptionClass1, + Class<E2> exceptionClass2, + Class<E3> exceptionClass3) + throws InterruptedException { + recordDeps(depKeys); + return delegate.getValuesOrThrow(depKeys, exceptionClass1, exceptionClass2, exceptionClass3); + } + + @Override + public <E1 extends Exception, E2 extends Exception, E3 extends Exception, E4 extends Exception> + Map<SkyKey, ValueOrException4<E1, E2, E3, E4>> getValuesOrThrow( + Iterable<? extends SkyKey> depKeys, + Class<E1> exceptionClass1, + Class<E2> exceptionClass2, + Class<E3> exceptionClass3, + Class<E4> exceptionClass4) + throws InterruptedException { + recordDeps(depKeys); + return delegate.getValuesOrThrow( + depKeys, exceptionClass1, exceptionClass2, exceptionClass3, exceptionClass4); + } + + @Override + public < + E1 extends Exception, + E2 extends Exception, + E3 extends Exception, + E4 extends Exception, + E5 extends Exception> + Map<SkyKey, ValueOrException5<E1, E2, E3, E4, E5>> getValuesOrThrow( + Iterable<? extends SkyKey> depKeys, + Class<E1> exceptionClass1, + Class<E2> exceptionClass2, + Class<E3> exceptionClass3, + Class<E4> exceptionClass4, + Class<E5> exceptionClass5) + throws InterruptedException { + recordDeps(depKeys); + return delegate.getValuesOrThrow( + depKeys, + exceptionClass1, + exceptionClass2, + exceptionClass3, + exceptionClass4, + exceptionClass5); + } + + @Override + public boolean valuesMissing() { + return delegate.valuesMissing(); + } + + @Override + public ExtendedEventHandler getListener() { + return delegate.getListener(); + } + + @Override + public boolean inErrorBubblingForTesting() { + return delegate.inErrorBubblingForTesting(); + } + + @Nullable + @Override + public GroupedList<SkyKey> getTemporaryDirectDeps() { + return delegate.getTemporaryDirectDeps(); + } +} |