From 81cb233c34f7e198c653096e1062391b5c1a710c Mon Sep 17 00:00:00 2001 From: Sotr Date: Tue, 5 Jun 2018 19:10:38 +0800 Subject: [PATCH] Customable players per io thread --- .../server/core/AkarinGlobalConfig.java | 5 ++++ .../mixin/core/MixinChunkIOExecutor.java | 25 +++++++++++++++++++ .../akarin/server/mixin/core/MixinMCUtil.java | 1 + .../main/resources/mixins.akarin.core.json | 1 + 4 files changed, 32 insertions(+) create mode 100644 sources/src/main/java/io/akarin/server/mixin/core/MixinChunkIOExecutor.java 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 b5c9271a3..fe30a6816 100644 --- a/sources/src/main/java/io/akarin/server/core/AkarinGlobalConfig.java +++ b/sources/src/main/java/io/akarin/server/core/AkarinGlobalConfig.java @@ -157,4 +157,9 @@ public class AkarinGlobalConfig { private static void registryTerminationSeconds() { registryTerminationSeconds = getSeconds(getString("bootstrap.parallel-registry-termination", "9s")); } + + public static int playersPerIOThread; + private static void playersPerIOThread() { + playersPerIOThread = getInt("chunk.players-per-chunk-io-thread", 50); + } } diff --git a/sources/src/main/java/io/akarin/server/mixin/core/MixinChunkIOExecutor.java b/sources/src/main/java/io/akarin/server/mixin/core/MixinChunkIOExecutor.java new file mode 100644 index 000000000..0b6603e43 --- /dev/null +++ b/sources/src/main/java/io/akarin/server/mixin/core/MixinChunkIOExecutor.java @@ -0,0 +1,25 @@ +package io.akarin.server.mixin.core; + +import org.bukkit.craftbukkit.chunkio.ChunkIOExecutor; +import org.bukkit.craftbukkit.util.AsynchronousExecutor; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; + +import io.akarin.server.core.AkarinGlobalConfig; +import net.minecraft.server.Chunk; + +@Mixin(value = ChunkIOExecutor.class, remap = false) +public class MixinChunkIOExecutor { + @Shadow @Final static int BASE_THREADS; + @Shadow @Mutable @Final static int PLAYERS_PER_THREAD; + @Shadow @Final private static AsynchronousExecutor instance; + + @Overwrite + public static void adjustPoolSize(int players) { + int size = Math.max(BASE_THREADS, (int) Math.ceil(players / (PLAYERS_PER_THREAD = AkarinGlobalConfig.playersPerIOThread))); + instance.setActiveThreads(size); + } +} diff --git a/sources/src/main/java/io/akarin/server/mixin/core/MixinMCUtil.java b/sources/src/main/java/io/akarin/server/mixin/core/MixinMCUtil.java index da90f8d6d..5f7c17327 100644 --- a/sources/src/main/java/io/akarin/server/mixin/core/MixinMCUtil.java +++ b/sources/src/main/java/io/akarin/server/mixin/core/MixinMCUtil.java @@ -4,6 +4,7 @@ import java.util.function.Supplier; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Overwrite; + import net.minecraft.server.MCUtil; @Mixin(value = MCUtil.class, remap = false) diff --git a/sources/src/main/resources/mixins.akarin.core.json b/sources/src/main/resources/mixins.akarin.core.json index ac2b5b928..a9e68d25d 100644 --- a/sources/src/main/resources/mixins.akarin.core.json +++ b/sources/src/main/resources/mixins.akarin.core.json @@ -19,6 +19,7 @@ "MixinTimingHandler", "MixinVersionCommand", "MixinMinecraftServer", + "MixinChunkIOExecutor", "MixinTileEntityEnchantTable" ] } \ No newline at end of file