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 f1c9da785..82a15106f 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; @@ -102,7 +102,7 @@ public abstract class MixinChunk implements IMixinChunk { @Inject(method = "", at = @At("RETURN")) public void onConstruct(World worldIn, int x, int z, CallbackInfo ci) { - this.lightExecutorService = ((IMixinWorldServer) worldIn).getLightingExecutor(); + lightExecutorService = ((IMixinWorldServer) worldIn).getLightingExecutor(); } @Override @@ -124,7 +124,7 @@ public abstract class MixinChunk implements IMixinChunk { private void onTickHead(boolean skipRecheckGaps, CallbackInfo ci) { final List neighbors = this.getSurroundingChunks(); if (this.isGapLightingUpdated && this.world.worldProvider.m() && !skipRecheckGaps && !neighbors.isEmpty()) { // PAIL: hasSkyLight - this.lightExecutorService.execute(() -> { + lightExecutorService.execute(() -> { this.recheckGapsAsync(neighbors); }); this.isGapLightingUpdated = false; @@ -133,7 +133,7 @@ public abstract class MixinChunk implements IMixinChunk { this.ticked = true; if (!this.isLightPopulated && this.isTerrainPopulated && !neighbors.isEmpty()) { - this.lightExecutorService.execute(() -> { + lightExecutorService.execute(() -> { this.checkLightAsync(neighbors); }); // set to true to avoid requeuing the same task when not finished @@ -232,7 +232,7 @@ public abstract class MixinChunk implements IMixinChunk { @Inject(method = "o()V", at = @At("HEAD"), cancellable = true) private void checkLightHead(CallbackInfo ci) { - if (this.world.getMinecraftServer().isStopped() || this.lightExecutorService.isShutdown()) { + if (this.world.getMinecraftServer().isStopped() || lightExecutorService.isShutdown()) { return; } @@ -247,13 +247,13 @@ public abstract class MixinChunk implements IMixinChunk { if (Akari.isPrimaryThread()) { try { - this.lightExecutorService.execute(() -> { + lightExecutorService.execute(() -> { this.checkLightAsync(neighborChunks); }); } catch (RejectedExecutionException ex) { // This could happen if ServerHangWatchdog kills the server // between the start of the method and the execute() call. - if (!this.world.getMinecraftServer().isStopped() && !this.lightExecutorService.isShutdown()) { + if (!this.world.getMinecraftServer().isStopped() && !lightExecutorService.isShutdown()) { throw ex; } } @@ -451,7 +451,7 @@ public abstract class MixinChunk implements IMixinChunk { @Inject(method = "c(III)V", at = @At("HEAD"), cancellable = true) private void onRelightBlock(int x, int y, int z, CallbackInfo ci) { - this.lightExecutorService.execute(() -> { + lightExecutorService.execute(() -> { this.relightBlockAsync(x, y, z); }); ci.cancel(); 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 035d4858e..254adf01d 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 @@ -54,9 +54,9 @@ 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 ExecutorService lightExecutorService = getExecutorService(); + private static final ExecutorService lightExecutorService = getExecutorService(); - private ExecutorService getExecutorService() { + private static ExecutorService getExecutorService() { return AkarinGlobalConfig.asyncLightingWorkStealing ? Executors.newFixedThreadPool(AkarinGlobalConfig.asyncLightingThreads, new ThreadFactoryBuilder().setNameFormat("Akarin Async Light Thread").build()) : Executors.newWorkStealingPool(AkarinGlobalConfig.asyncLightingThreads); }