From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Simon Gardling Date: Thu, 8 Jul 2021 17:03:31 -0400 Subject: [PATCH] Use MCUtil.asyncExecutor for MAIN_WORKER_EXECUTOR in SystemUtils Original code by Titaniumtown, licensed under GNU General Public License v3.0 You can find the original code on https://gitlab.com/Titaniumtown/JettPack diff --git a/src/main/java/net/minecraft/Util.java b/src/main/java/net/minecraft/Util.java index bd50d7f001aac517dcb9004241896ef20a589cd1..44a816d966e0834972ac54f18928b49ac1b57009 100644 --- a/src/main/java/net/minecraft/Util.java +++ b/src/main/java/net/minecraft/Util.java @@ -67,6 +67,10 @@ import org.apache.logging.log4j.core.LoggerContext; import org.apache.logging.log4j.core.config.Configuration; import org.apache.logging.log4j.core.lookup.StrLookup; import org.apache.logging.log4j.core.lookup.StrSubstitutor; +import java.util.concurrent.AbstractExecutorService; +import wtf.etil.mirai.server.util.ServerWorkerWrapper; +import net.minecraft.server.MCUtil; +import java.util.Collections; public class Util { static final Logger LOGGER = LogManager.getLogger(); @@ -151,7 +155,43 @@ public class Util { if (i <= 0) { executorService = MoreExecutors.newDirectExecutorService(); } else { - executorService = new java.util.concurrent.ThreadPoolExecutor(i, i,0L, TimeUnit.MILLISECONDS, new java.util.concurrent.LinkedBlockingQueue(), target -> new net.minecraft.server.ServerWorkerThread(target, s, priorityModifier)); + executorService = Integer.getInteger("Paper.WorkerThreadCount", i) <= 0 ? MoreExecutors.newDirectExecutorService() : new AbstractExecutorService(){ + private volatile boolean shutdown = false; + + @Override + public final List shutdownNow() { + this.shutdown = true; + return Collections.emptyList(); + } + + @Override + public final void shutdown() { + this.shutdown = true; + } + + @Override + public final boolean isShutdown() { + return this.shutdown; + } + + @Override + public final boolean isTerminated() { + return this.shutdown; + } + + @Override + public final boolean awaitTermination(long l2, TimeUnit timeUnit) throws InterruptedException { + if (!this.shutdown) { + throw new UnsupportedOperationException(); + } + return true; + } + + @Override + public final void execute(Runnable runnable) { + MCUtil.asyncExecutor.execute(new ServerWorkerWrapper(runnable)); + } + }; } /* @Override diff --git a/src/main/java/wtf/etil/mirai/server/util/ServerWorkerWrapper.java b/src/main/java/wtf/etil/mirai/server/util/ServerWorkerWrapper.java new file mode 100644 index 0000000000000000000000000000000000000000..4633764f3d806c7e29cbda6e85db5a3432ad0c29 --- /dev/null +++ b/src/main/java/wtf/etil/mirai/server/util/ServerWorkerWrapper.java @@ -0,0 +1,24 @@ +package wtf.etil.mirai.server.util; + +import com.google.common.base.Preconditions; +import net.minecraft.Util; + +public final class ServerWorkerWrapper implements Runnable { + private final Runnable internalRunnable; + + public ServerWorkerWrapper(Runnable runnable) { + this.internalRunnable = Preconditions.checkNotNull(runnable, "internalRunnable"); + } + + @Override + public final void run() { + try { + this.internalRunnable.run(); + return; + } + catch (Throwable throwable) { + Util.onThreadException(Thread.currentThread(), throwable); + return; + } + } +} \ No newline at end of file