diff --git a/src/main/java/net/fabricmc/tinyremapper/TinyRemapper.java b/src/main/java/net/fabricmc/tinyremapper/TinyRemapper.java index a7f0c090..91458020 100644 --- a/src/main/java/net/fabricmc/tinyremapper/TinyRemapper.java +++ b/src/main/java/net/fabricmc/tinyremapper/TinyRemapper.java @@ -43,6 +43,7 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.concurrent.ForkJoinPool; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; @@ -209,6 +210,13 @@ public Builder extension(TinyRemapper.Extension extension) { extension.attach(this); return this; } + + public Builder useForkJoinPool() { + ForkJoinPool pool = ForkJoinPool.commonPool(); + this.threadCount = pool.getParallelism(); + this.service = pool; + return this; + } public TinyRemapper build() { TinyRemapper remapper = new TinyRemapper(mappingProviders, ignoreFieldDesc, threadCount, @@ -218,7 +226,7 @@ public TinyRemapper build() { removeFrames, ignoreConflicts, resolveMissing, checkPackageAccess || fixPackageAccess, fixPackageAccess, rebuildSourceFilenames, skipLocalMapping, renameInvalidLocals, invalidLvNamePattern, inferNameFromSameLvIndex, analyzeVisitors, stateProcessors, preApplyVisitors, postApplyVisitors, - extraRemapper); + extraRemapper, service); return remapper; } @@ -246,6 +254,7 @@ public TinyRemapper build() { private final List preApplyVisitors = new ArrayList<>(); private final List postApplyVisitors = new ArrayList<>(); private Remapper extraRemapper; + private ExecutorService service; } public interface Extension { @@ -279,12 +288,12 @@ private TinyRemapper(Collection mappingProviders, boolean igno boolean renameInvalidLocals, Pattern invalidLvNamePattern, boolean inferNameFromSameLvIndex, List analyzeVisitors, List stateProcessors, List preApplyVisitors, List postApplyVisitors, - Remapper extraRemapper) { + Remapper extraRemapper, ExecutorService service) { this.mappingProviders = mappingProviders; this.ignoreFieldDesc = ignoreFieldDesc; this.threadCount = threadCount > 0 ? threadCount : Math.max(Runtime.getRuntime().availableProcessors(), 2); this.keepInputData = keepInputData; - this.threadPool = Executors.newFixedThreadPool(this.threadCount); + this.threadPool = service == null ? Executors.newFixedThreadPool(this.threadCount) : service; this.forcePropagation = forcePropagation; this.propagatePrivate = propagatePrivate; this.propagateBridges = propagateBridges; @@ -311,12 +320,16 @@ public static Builder newRemapper() { } public void finish() { - threadPool.shutdown(); - - try { - threadPool.awaitTermination(20, TimeUnit.SECONDS); - } catch (InterruptedException e) { - e.printStackTrace(); + if(threadPool == ForkJoinPool.commonPool()) { + ((ForkJoinPool)threadPool).awaitQuiescence(20, TimeUnit.SECONDS); + } else { + threadPool.shutdown(); + + try { + threadPool.awaitTermination(20, TimeUnit.SECONDS); + } catch(InterruptedException e) { + e.printStackTrace(); + } } outputBuffer = null;