Configurable lighting threads
This commit is contained in:
@@ -184,6 +184,16 @@ public class AkarinGlobalConfig {
|
|||||||
keepAliveTimeout = getSeconds(getString("core.keep-alive-response-timeout", "30s"));
|
keepAliveTimeout = getSeconds(getString("core.keep-alive-response-timeout", "30s"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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 allowSpawnerModify;
|
public static boolean allowSpawnerModify;
|
||||||
private static void allowSpawnerModify() {
|
private static void allowSpawnerModify() {
|
||||||
allowSpawnerModify = getBoolean("alternative.allow-spawner-modify", true);
|
allowSpawnerModify = getBoolean("alternative.allow-spawner-modify", true);
|
||||||
|
|||||||
@@ -203,7 +203,7 @@ public abstract class MixinChunk implements IMixinChunk {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// this.m = false; // PAIL: isGapLightingUpdated
|
// this.isGapLightingUpdated = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -250,11 +250,11 @@ public abstract class MixinChunk implements IMixinChunk {
|
|||||||
this.lightExecutorService.execute(() -> {
|
this.lightExecutorService.execute(() -> {
|
||||||
this.checkLightAsync(neighborChunks);
|
this.checkLightAsync(neighborChunks);
|
||||||
});
|
});
|
||||||
} catch (RejectedExecutionException e) {
|
} catch (RejectedExecutionException ex) {
|
||||||
// This could happen if ServerHangWatchdog kills the server
|
// This could happen if ServerHangWatchdog kills the server
|
||||||
// between the start of the method and the execute() call.
|
// between the start of the method and the execute() call.
|
||||||
if (!this.world.getMinecraftServer().isStopped() && !this.lightExecutorService.isShutdown()) {
|
if (!this.world.getMinecraftServer().isStopped() && !this.lightExecutorService.isShutdown()) {
|
||||||
throw e;
|
throw ex;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -27,7 +27,6 @@ package io.akarin.server.mixin.lighting;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
import java.util.concurrent.Executors;
|
import java.util.concurrent.Executors;
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
@@ -36,6 +35,7 @@ import com.google.common.util.concurrent.ThreadFactoryBuilder;
|
|||||||
|
|
||||||
import io.akarin.api.mixin.IMixinChunk;
|
import io.akarin.api.mixin.IMixinChunk;
|
||||||
import io.akarin.api.mixin.IMixinWorldServer;
|
import io.akarin.api.mixin.IMixinWorldServer;
|
||||||
|
import io.akarin.server.core.AkarinGlobalConfig;
|
||||||
import net.minecraft.server.BlockPosition;
|
import net.minecraft.server.BlockPosition;
|
||||||
import net.minecraft.server.Chunk;
|
import net.minecraft.server.Chunk;
|
||||||
import net.minecraft.server.EnumDirection;
|
import net.minecraft.server.EnumDirection;
|
||||||
@@ -53,7 +53,8 @@ public abstract class MixinWorldServer extends MixinWorld implements IMixinWorld
|
|||||||
private static final short XZ_MASK = 0xF;
|
private static final short XZ_MASK = 0xF;
|
||||||
private static final short Y_SHORT_MASK = 0xFF;
|
private static final short Y_SHORT_MASK = 0xFF;
|
||||||
|
|
||||||
private final ExecutorService lightExecutorService = Executors.newFixedThreadPool(1, new ThreadFactoryBuilder().setNameFormat("Akarin Async Light Thread").build());
|
private final ExecutorService lightExecutorService = AkarinGlobalConfig.asyncLightingWorkStealing ?
|
||||||
|
Executors.newFixedThreadPool(AkarinGlobalConfig.asyncLightingThreads, new ThreadFactoryBuilder().setNameFormat("Akarin Async Light Thread").build()) : Executors.newWorkStealingPool(AkarinGlobalConfig.asyncLightingThreads);
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean checkLightFor(EnumSkyBlock lightType, BlockPosition pos) { // PAIL: checkLightFor
|
public boolean checkLightFor(EnumSkyBlock lightType, BlockPosition pos) { // PAIL: checkLightFor
|
||||||
@@ -239,7 +240,6 @@ public abstract class MixinWorldServer extends MixinWorld implements IMixinWorld
|
|||||||
neighbor.setLightUpdateTime(chunk.getWorld().getTime());
|
neighbor.setLightUpdateTime(chunk.getWorld().getTime());
|
||||||
}
|
}
|
||||||
|
|
||||||
//System.out.println("size = " + ((ThreadPoolExecutor) this.lightExecutorService).getQueue().size());
|
|
||||||
if (Bukkit.isPrimaryThread()) {
|
if (Bukkit.isPrimaryThread()) {
|
||||||
this.lightExecutorService.execute(() -> {
|
this.lightExecutorService.execute(() -> {
|
||||||
this.checkLightAsync(lightType, pos, chunk, neighbors);
|
this.checkLightAsync(lightType, pos, chunk, neighbors);
|
||||||
@@ -342,7 +342,7 @@ public abstract class MixinWorldServer extends MixinWorld implements IMixinWorld
|
|||||||
final Chunk chunk = this.getLightChunk(pos, currentChunk, neighbors);
|
final Chunk chunk = this.getLightChunk(pos, currentChunk, neighbors);
|
||||||
if (chunk != null && !chunk.isUnloading()) {
|
if (chunk != null && !chunk.isUnloading()) {
|
||||||
chunk.a(type, pos, lightValue); // PAIL: setBrightness
|
chunk.a(type, pos, lightValue); // PAIL: setBrightness
|
||||||
this.notifyLightSet(pos); // PAIL: notifyLightSet
|
this.notifyLightSet(pos);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user