aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/skyframe/SkyframePackageManager.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/skyframe/SkyframePackageManager.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/SkyframePackageManager.java177
1 files changed, 177 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframePackageManager.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframePackageManager.java
new file mode 100644
index 0000000000..cc32bf816c
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframePackageManager.java
@@ -0,0 +1,177 @@
+// Copyright 2014 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.devtools.build.lib.cmdline.LabelValidator;
+import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
+import com.google.devtools.build.lib.events.EventHandler;
+import com.google.devtools.build.lib.packages.NoSuchPackageException;
+import com.google.devtools.build.lib.packages.NoSuchTargetException;
+import com.google.devtools.build.lib.packages.Package;
+import com.google.devtools.build.lib.packages.PackageIdentifier;
+import com.google.devtools.build.lib.packages.Target;
+import com.google.devtools.build.lib.pkgcache.PackageManager;
+import com.google.devtools.build.lib.pkgcache.PathPackageLocator;
+import com.google.devtools.build.lib.pkgcache.TargetPatternEvaluator;
+import com.google.devtools.build.lib.pkgcache.TransitivePackageLoader;
+import com.google.devtools.build.lib.skyframe.SkyframeExecutor.SkyframePackageLoader;
+import com.google.devtools.build.lib.syntax.Label;
+import com.google.devtools.build.lib.vfs.Path;
+import com.google.devtools.build.lib.vfs.UnixGlob;
+import com.google.devtools.build.skyframe.CyclesReporter;
+
+import java.io.PrintStream;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicReference;
+
+/**
+ * Skyframe-based package manager.
+ *
+ * <p>This is essentially a compatibility shim between the native Skyframe and non-Skyframe
+ * parts of Blaze and should not be long-lived.
+ */
+class SkyframePackageManager implements PackageManager {
+
+ private final SkyframePackageLoader packageLoader;
+ private final SkyframeExecutor.SkyframeTransitivePackageLoader transitiveLoader;
+ private final TargetPatternEvaluator patternEvaluator;
+ private final AtomicReference<UnixGlob.FilesystemCalls> syscalls;
+ private final AtomicReference<CyclesReporter> skyframeCyclesReporter;
+ private final AtomicReference<PathPackageLocator> pkgLocator;
+ private final AtomicInteger numPackagesLoaded;
+ private final SkyframeExecutor skyframeExecutor;
+
+ public SkyframePackageManager(SkyframePackageLoader packageLoader,
+ SkyframeExecutor.SkyframeTransitivePackageLoader transitiveLoader,
+ TargetPatternEvaluator patternEvaluator,
+ AtomicReference<UnixGlob.FilesystemCalls> syscalls,
+ AtomicReference<CyclesReporter> skyframeCyclesReporter,
+ AtomicReference<PathPackageLocator> pkgLocator,
+ AtomicInteger numPackagesLoaded,
+ SkyframeExecutor skyframeExecutor) {
+ this.packageLoader = packageLoader;
+ this.transitiveLoader = transitiveLoader;
+ this.patternEvaluator = patternEvaluator;
+ this.skyframeCyclesReporter = skyframeCyclesReporter;
+ this.pkgLocator = pkgLocator;
+ this.syscalls = syscalls;
+ this.numPackagesLoaded = numPackagesLoaded;
+ this.skyframeExecutor = skyframeExecutor;
+ }
+
+ @Override
+ public Package getLoadedPackage(PackageIdentifier pkgIdentifier) throws NoSuchPackageException {
+ return packageLoader.getLoadedPackage(pkgIdentifier);
+ }
+
+ @ThreadSafe
+ @Override
+ public Package getPackage(EventHandler eventHandler, PackageIdentifier packageIdentifier)
+ throws NoSuchPackageException, InterruptedException {
+ try {
+ return packageLoader.getPackage(eventHandler, packageIdentifier);
+ } catch (NoSuchPackageException e) {
+ if (e.getPackage() != null) {
+ return e.getPackage();
+ }
+ throw e;
+ }
+ }
+
+ @Override
+ public Target getLoadedTarget(Label label) throws NoSuchPackageException, NoSuchTargetException {
+ return getLoadedPackage(label.getPackageIdentifier()).getTarget(label.getName());
+ }
+
+ @Override
+ public Target getTarget(EventHandler eventHandler, Label label)
+ throws NoSuchPackageException, NoSuchTargetException, InterruptedException {
+ return getPackage(eventHandler, label.getPackageIdentifier()).getTarget(label.getName());
+ }
+
+ @Override
+ public boolean isTargetCurrent(Target target) {
+ Package pkg = target.getPackage();
+ try {
+ return getLoadedPackage(target.getLabel().getPackageIdentifier()) == pkg;
+ } catch (NoSuchPackageException e) {
+ return false;
+ }
+ }
+
+ @Override
+ public void partiallyClear() {
+ packageLoader.partiallyClear();
+ }
+
+ @Override
+ public PackageManagerStatistics getStatistics() {
+ return new PackageManagerStatistics() {
+ @Override
+ public int getPackagesLoaded() {
+ return numPackagesLoaded.get();
+ }
+
+ @Override
+ public int getPackagesLookedUp() {
+ return -1;
+ }
+
+ @Override
+ public int getCacheSize() {
+ return -1;
+ }
+ };
+ }
+
+ @Override
+ public boolean isPackage(String packageName) {
+ return getBuildFileForPackage(packageName) != null;
+ }
+
+ @Override
+ public void dump(PrintStream printStream) {
+ skyframeExecutor.dumpPackages(printStream);
+ }
+
+ @ThreadSafe
+ @Override
+ public Path getBuildFileForPackage(String packageName) {
+ // Note that this method needs to be thread-safe, as it is currently used concurrently by
+ // legacy blaze code.
+ if (packageLoader.isPackageDeleted(packageName)
+ || LabelValidator.validatePackageName(packageName) != null) {
+ return null;
+ }
+ // TODO(bazel-team): Use a PackageLookupValue here [skyframe-loading]
+ // TODO(bazel-team): The implementation in PackageCache also checks for duplicate packages, see
+ // BuildFileCache#getBuildFile [skyframe-loading]
+ return pkgLocator.get().getPackageBuildFileNullable(packageName, syscalls);
+ }
+
+ @Override
+ public PathPackageLocator getPackagePath() {
+ return pkgLocator.get();
+ }
+
+ @Override
+ public TransitivePackageLoader newTransitiveLoader() {
+ return new SkyframeLabelVisitor(transitiveLoader, skyframeCyclesReporter);
+ }
+
+ @Override
+ public TargetPatternEvaluator getTargetPatternEvaluator() {
+ return patternEvaluator;
+ }
+}