Internal refactoring

PiperOrigin-RevId: 686495724
Change-Id: I07c07ec72cd461e74a0ec959d074abf4aaeaf7e6
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;
     }