Internal refactoring

PiperOrigin-RevId: 686495724
Change-Id: I07c07ec72cd461e74a0ec959d074abf4aaeaf7e6
diff --git a/src/main/java/com/google/devtools/build/lib/query2/PostAnalysisQueryEnvironment.java b/src/main/java/com/google/devtools/build/lib/query2/PostAnalysisQueryEnvironment.java
index 93664aa..7381592 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/PostAnalysisQueryEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/PostAnalysisQueryEnvironment.java
@@ -89,6 +89,7 @@
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
+import java.util.Optional;
 import java.util.OptionalInt;
 import java.util.Set;
 import java.util.function.Function;
@@ -193,6 +194,7 @@
             eventHandler,
             FilteringPolicies.NO_FILTER,
             MultisetSemaphore.unbounded(),
+            /* maxConcurrentGetTargetsTasks= */ Optional.empty(),
             SimplePackageIdentifierBatchingCallback::new);
     checkSettings(settings);
   }
diff --git a/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java b/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java
index 6bef4d2..3898068 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java
@@ -300,6 +300,7 @@
         eventHandler,
         FilteringPolicies.NO_FILTER,
         packageSemaphore,
+        /* maxConcurrentGetTargetsTasks= */ Optional.empty(),
         SimplePackageIdentifierBatchingCallback::new);
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePackageProviderBackedTargetPatternResolver.java b/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePackageProviderBackedTargetPatternResolver.java
index f56094e..cf625e0 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePackageProviderBackedTargetPatternResolver.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePackageProviderBackedTargetPatternResolver.java
@@ -59,9 +59,11 @@
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
+import java.util.concurrent.Semaphore;
 import javax.annotation.Nullable;
 
 /** A {@link TargetPatternResolver} backed by a {@link RecursivePackageProvider}. */
@@ -76,6 +78,8 @@
   private final RecursivePackageProvider recursivePackageProvider;
   private final ExtendedEventHandler eventHandler;
   private final MultisetSemaphore<PackageIdentifier> packageSemaphore;
+
+  @Nullable private final Semaphore getTargetsTaskSemaphore;
   private final PackageIdentifierBatchingCallback.Factory packageIdentifierBatchingCallbackFactory;
 
   public RecursivePackageProviderBackedTargetPatternResolver(
@@ -83,11 +87,16 @@
       ExtendedEventHandler eventHandler,
       FilteringPolicy policy,
       MultisetSemaphore<PackageIdentifier> packageSemaphore,
+      Optional<Integer> maxConcurrentGetTargetsTasks,
       PackageIdentifierBatchingCallback.Factory packageIdentifierBatchingCallbackFactory) {
     this.recursivePackageProvider = recursivePackageProvider;
     this.eventHandler = eventHandler;
     this.policy = policy;
     this.packageSemaphore = packageSemaphore;
+    this.getTargetsTaskSemaphore =
+        maxConcurrentGetTargetsTasks.isPresent()
+            ? new Semaphore(maxConcurrentGetTargetsTasks.get())
+            : null;
     this.packageIdentifierBatchingCallbackFactory = packageIdentifierBatchingCallbackFactory;
   }
 
@@ -348,9 +357,22 @@
       this.callback = callback;
     }
 
+    private void acquireTaskLock() throws InterruptedException {
+      if (getTargetsTaskSemaphore != null) {
+        getTargetsTaskSemaphore.acquire();
+      }
+    }
+
+    private void releaseTaskLock() {
+      if (getTargetsTaskSemaphore != null) {
+        getTargetsTaskSemaphore.release();
+      }
+    }
+
     @Override
     public Void call() throws E, InterruptedException {
       ImmutableSet<PackageIdentifier> pkgIdBatchSet = ImmutableSet.copyOf(packageIdentifiers);
+      acquireTaskLock();
       packageSemaphore.acquireAll(pkgIdBatchSet);
       try {
         Iterable<Collection<Target>> resolvedTargets =
@@ -372,6 +394,7 @@
         callback.process(filteredTargets);
       } finally {
         packageSemaphore.releaseAll(pkgIdBatchSet);
+        releaseTaskLock();
       }
       return null;
     }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeTargetPatternEvaluator.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeTargetPatternEvaluator.java
index 6abd924..c0bf831 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeTargetPatternEvaluator.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeTargetPatternEvaluator.java
@@ -51,6 +51,7 @@
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.concurrent.atomic.AtomicReference;
 import javax.annotation.Nullable;
 
@@ -296,6 +297,7 @@
               eventHandler,
               FilteringPolicies.NO_FILTER,
               /* packageSemaphore= */ null,
+              /* maxConcurrentGetTargetsTasks= */ Optional.empty(),
               SimplePackageIdentifierBatchingCallback::new);
       AtomicReference<Collection<Target>> result = new AtomicReference<>();
       try {
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternFunction.java
index 9fc8c59..08d2ec4 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternFunction.java
@@ -35,6 +35,7 @@
 import com.google.devtools.build.skyframe.SkyFunctionException;
 import com.google.devtools.build.skyframe.SkyKey;
 import com.google.devtools.build.skyframe.SkyValue;
+import java.util.Optional;
 import javax.annotation.Nullable;
 
 /**
@@ -69,6 +70,7 @@
               env.getListener(),
               patternKey.getPolicy(),
               MultisetSemaphore.unbounded(),
+              /* maxConcurrentGetTargetsTasks= */ Optional.empty(),
               SimplePackageIdentifierBatchingCallback::new);
       ImmutableSet<PathFragment> excludedSubdirectories = patternKey.getExcludedSubdirectories();
       ResolvedTargets.Builder<Target> resolvedTargetsBuilder = ResolvedTargets.builder();