diff --git a/sources/src/main/java/io/akarin/server/core/AkarinGlobalConfig.java b/sources/src/main/java/io/akarin/server/core/AkarinGlobalConfig.java index 62115a4f5..d4fe9c2e7 100644 --- a/sources/src/main/java/io/akarin/server/core/AkarinGlobalConfig.java +++ b/sources/src/main/java/io/akarin/server/core/AkarinGlobalConfig.java @@ -185,6 +185,16 @@ public class AkarinGlobalConfig { keepAliveTimeout = getSeconds(getString("core.keep-alive-response-timeout", "30s")) * 1000; } + public static int asyncLightingThreads; + private static void asyncLightingThreads() { + asyncLightingThreads = getInt("core.async-lighting.executor-threads", 2); + } + + public static boolean asyncLightingWorkStealing; + private static void asyncLightingWorkStealing() { + asyncLightingWorkStealing = getBoolean("core.async-lighting.use-work-stealing", false); + } + public static boolean throwOnAsyncCaught; private static void throwOnAsyncCaught() { throwOnAsyncCaught = getBoolean("core.thread-safe.async-catcher.throw-on-caught", true); diff --git a/sources/src/main/java/io/akarin/server/core/AkarinSlackScheduler.java b/sources/src/main/java/io/akarin/server/core/AkarinSlackScheduler.java index c279d23ca..5549afd10 100644 --- a/sources/src/main/java/io/akarin/server/core/AkarinSlackScheduler.java +++ b/sources/src/main/java/io/akarin/server/core/AkarinSlackScheduler.java @@ -18,10 +18,10 @@ public class AkarinSlackScheduler extends Thread { return Singleton.instance; } - public static void boot() { - Singleton.instance.setName("Akarin Slack Scheduler Thread"); - Singleton.instance.setDaemon(true); - Singleton.instance.start(); + public void boot() { + setName("Akarin Slack Scheduler Thread"); + setDaemon(true); + start(); Akari.logger.info("Slack scheduler service started"); } diff --git a/sources/src/main/java/io/akarin/server/mixin/core/MixinAsyncCatcher.java b/sources/src/main/java/io/akarin/server/mixin/core/MixinAsyncCatcher.java index 3255877e1..bf329d5a1 100644 --- a/sources/src/main/java/io/akarin/server/mixin/core/MixinAsyncCatcher.java +++ b/sources/src/main/java/io/akarin/server/mixin/core/MixinAsyncCatcher.java @@ -7,7 +7,6 @@ import org.spongepowered.asm.mixin.Shadow; import io.akarin.api.internal.Akari; import io.akarin.server.core.AkarinGlobalConfig; -import net.minecraft.server.PersistentCollection; @Mixin(value = AsyncCatcher.class, remap = false) public abstract class MixinAsyncCatcher { @@ -23,7 +22,6 @@ public abstract class MixinAsyncCatcher { } else { Akari.logger.warn("Asynchronous " + reason + "!"); Thread.dumpStack(); - PersistentCollection.class.getName(); } } } diff --git a/sources/src/main/java/io/akarin/server/mixin/core/MixinMinecraftServer.java b/sources/src/main/java/io/akarin/server/mixin/core/MixinMinecraftServer.java index 3a7ded34f..5a9ff3e6d 100644 --- a/sources/src/main/java/io/akarin/server/mixin/core/MixinMinecraftServer.java +++ b/sources/src/main/java/io/akarin/server/mixin/core/MixinMinecraftServer.java @@ -59,7 +59,7 @@ public abstract class MixinMinecraftServer { WorldServer world = worlds.get(i); TileEntityHopper.skipHopperEvents = world.paperConfig.disableHopperMoveEvents || InventoryMoveItemEvent.getHandlerList().getRegisteredListeners().length == 0; } - AkarinSlackScheduler.boot(); + AkarinSlackScheduler.get().boot(); } @Overwrite diff --git a/sources/src/main/java/io/akarin/server/mixin/lighting/MixinChunk.java b/sources/src/main/java/io/akarin/server/mixin/lighting/MixinChunk.java index 14d4c5f93..77503216d 100644 --- a/sources/src/main/java/io/akarin/server/mixin/lighting/MixinChunk.java +++ b/sources/src/main/java/io/akarin/server/mixin/lighting/MixinChunk.java @@ -68,7 +68,7 @@ public abstract class MixinChunk implements IMixinChunk { private CopyOnWriteArrayList queuedBlockLightingUpdates = new CopyOnWriteArrayList<>(); private AtomicInteger pendingLightUpdates = new AtomicInteger(); private long lightUpdateTime; - private ExecutorService lightExecutorService; + private static ExecutorService lightExecutorService; @Shadow(aliases = "m") private boolean isGapLightingUpdated; @Shadow(aliases = "r") private boolean ticked; diff --git a/sources/src/main/java/io/akarin/server/mixin/lighting/MixinWorldServer.java b/sources/src/main/java/io/akarin/server/mixin/lighting/MixinWorldServer.java index 3bb072c72..339680f48 100644 --- a/sources/src/main/java/io/akarin/server/mixin/lighting/MixinWorldServer.java +++ b/sources/src/main/java/io/akarin/server/mixin/lighting/MixinWorldServer.java @@ -27,8 +27,6 @@ package io.akarin.server.mixin.lighting; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import java.util.concurrent.ThreadFactory; - import javax.annotation.Nullable; import org.spongepowered.asm.mixin.Mixin; @@ -37,6 +35,7 @@ import com.google.common.util.concurrent.ThreadFactoryBuilder; import io.akarin.api.internal.Akari; import io.akarin.api.internal.mixin.IMixinChunk; import io.akarin.api.internal.mixin.IMixinWorldServer; +import io.akarin.server.core.AkarinGlobalConfig; import net.minecraft.server.BlockPosition; import net.minecraft.server.Chunk; import net.minecraft.server.EnumDirection; @@ -55,11 +54,12 @@ public abstract class MixinWorldServer extends MixinWorld implements IMixinWorld private static final short XZ_MASK = 0xF; private static final short Y_SHORT_MASK = 0xFF; - private final static ThreadFactory SERVICE_FACTORY = new ThreadFactoryBuilder().setNameFormat("Akarin Async Lighting Thread - %1$d").build(); private final ExecutorService lightExecutorService = getExecutorService(); - - private ExecutorService getExecutorService() { - return Executors.newFixedThreadPool(1, SERVICE_FACTORY); + private static ExecutorService getExecutorService() { + return AkarinGlobalConfig.asyncLightingWorkStealing ? + Executors.newFixedThreadPool(AkarinGlobalConfig.asyncLightingThreads, new ThreadFactoryBuilder().setNameFormat("Akarin Async Light Thread").build()) + : + Executors.newWorkStealingPool(AkarinGlobalConfig.asyncLightingThreads); } @Override