aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationValue.java
diff options
context:
space:
mode:
authorGravatar Greg Estren <gregce@google.com>2015-05-26 22:37:44 +0000
committerGravatar Laurent Le Brun <laurentlb@google.com>2015-05-27 16:46:09 +0000
commit531fc042bba338613978cf65d86a6299859f5e1e (patch)
treedd383164063fde81bf1e6a6135c32f5cf406385e /src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationValue.java
parentb46c6351321c2950badb4c0e4071e3f20d49e338 (diff)
Add an entry to TransitiveTargetValue that tracks the
configuration fragments needed by a rule's transitive closure. Also add a Skyframe BuildConfiguration node. Memory and performance profiling shows no noticeable performance hit in loading or analysis and a 0.35% memory increase for moderately sized (by Google standards) build graphs when these are depended upon in ConfiguredTargetFunction. -- MOS_MIGRATED_REVID=94517099
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationValue.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationValue.java113
1 files changed, 113 insertions, 0 deletions
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
new file mode 100644
index 0000000000..10f5d30776
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationValue.java
@@ -0,0 +1,113 @@
+// Copyright 2015 Google Inc. 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;
+
+import com.google.common.base.Preconditions;
+import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildOptions;
+import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
+import com.google.devtools.build.skyframe.SkyKey;
+import com.google.devtools.build.skyframe.SkyValue;
+
+import java.io.Serializable;
+import java.util.Objects;
+import java.util.Set;
+
+/**
+ * A Skyframe value representing a {@link BuildConfiguration}.
+ */
+// TODO(bazel-team): mark this immutable when BuildConfiguration is immutable.
+// @Immutable
+@ThreadSafe
+public class BuildConfigurationValue implements SkyValue {
+
+ private final BuildConfiguration configuration;
+
+ BuildConfigurationValue(BuildConfiguration configuration) {
+ this.configuration = configuration;
+ }
+
+ public BuildConfiguration getConfiguration() {
+ return configuration;
+ }
+
+ /**
+ * Returns the key for a requested configuration.
+ *
+ * @param fragments the fragments the configuration should contain
+ * @param buildOptions the build options the fragments should be built from
+ */
+ @ThreadSafe
+ public static SkyKey key(Set<Class<? extends BuildConfiguration.Fragment>> fragments,
+ BuildOptions buildOptions) {
+ return new SkyKey(SkyFunctions.BUILD_CONFIGURATION,
+ new Key(fragments, buildOptions, true));
+ }
+
+ /**
+ * Returns the key for a requested action-disabled configuration (actions generated by rules
+ * under the configuration are ignored).
+ *
+ * @param fragments the fragments the configuration should contain
+ * @param buildOptions the build options the fragments should be built from
+ */
+ @ThreadSafe
+ public static SkyKey disabledActionsKey(
+ Set<Class<? extends BuildConfiguration.Fragment>> fragments,
+ BuildOptions buildOptions) {
+ return new SkyKey(SkyFunctions.BUILD_CONFIGURATION,
+ new Key(fragments, buildOptions, false));
+ }
+
+ static final class Key implements Serializable {
+ private final Set<Class<? extends BuildConfiguration.Fragment>> fragments;
+ private final BuildOptions buildOptions;
+ private final boolean enableActions;
+
+ Key(Set<Class<? extends BuildConfiguration.Fragment>> fragments,
+ BuildOptions buildOptions, boolean enableActions) {
+ this.fragments = fragments;
+ this.buildOptions = Preconditions.checkNotNull(buildOptions);
+ this.enableActions = enableActions;
+ }
+
+ Set<Class<? extends BuildConfiguration.Fragment>> getFragments() {
+ return fragments;
+ }
+
+ BuildOptions getBuildOptions() {
+ return buildOptions;
+ }
+
+ boolean actionsEnabled() {
+ return enableActions;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (!(o instanceof Key)) {
+ return false;
+ }
+ Key otherConfig = (Key) o;
+ return Objects.equals(fragments, otherConfig.fragments)
+ && Objects.equals(buildOptions, otherConfig.buildOptions)
+ && otherConfig.actionsEnabled() == enableActions;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(fragments, buildOptions, enableActions);
+ }
+ }
+}