aboutsummaryrefslogtreecommitdiff
path: root/mod/src/main/java/moe/ymc/acron/mixin/ServerNetworkIoMixin.java
diff options
context:
space:
mode:
Diffstat (limited to 'mod/src/main/java/moe/ymc/acron/mixin/ServerNetworkIoMixin.java')
-rw-r--r--mod/src/main/java/moe/ymc/acron/mixin/ServerNetworkIoMixin.java65
1 files changed, 65 insertions, 0 deletions
diff --git a/mod/src/main/java/moe/ymc/acron/mixin/ServerNetworkIoMixin.java b/mod/src/main/java/moe/ymc/acron/mixin/ServerNetworkIoMixin.java
new file mode 100644
index 0000000..f49914e
--- /dev/null
+++ b/mod/src/main/java/moe/ymc/acron/mixin/ServerNetworkIoMixin.java
@@ -0,0 +1,65 @@
+package moe.ymc.acron.mixin;
+
+import io.netty.bootstrap.ServerBootstrap;
+import io.netty.channel.ChannelFuture;
+import io.netty.channel.MultithreadEventLoopGroup;
+import io.netty.channel.ServerChannel;
+import io.netty.channel.epoll.Epoll;
+import io.netty.channel.epoll.EpollServerSocketChannel;
+import io.netty.channel.nio.NioEventLoopGroup;
+import io.netty.channel.socket.nio.NioServerSocketChannel;
+import moe.ymc.acron.config.Config;
+import moe.ymc.acron.net.AcronInitializer;
+import net.minecraft.server.ServerNetworkIo;
+import net.minecraft.util.Lazy;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.spongepowered.asm.mixin.Final;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Shadow;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+
+import java.util.List;
+
+import static net.minecraft.server.ServerNetworkIo.EPOLL_CHANNEL;
+
+@Mixin(ServerNetworkIo.class)
+public class ServerNetworkIoMixin {
+ private static final Logger AC_LOGGER = LogManager.getLogger();
+
+ @Shadow
+ @Final
+ private List<ChannelFuture> channels;
+
+ @Shadow
+ @Final
+ public static Lazy<NioEventLoopGroup> DEFAULT_CHANNEL;
+
+ @Inject(at = @At("RETURN"), method = "<init>")
+ private void init(CallbackInfo info) {
+ AC_LOGGER.debug("Adding Acron channel.");
+ Lazy<? extends MultithreadEventLoopGroup> group;
+ Class<? extends ServerChannel> channel;
+ if (Epoll.isAvailable() && Config.getGlobalConfig().useNativeTransport()) {
+ channel = EpollServerSocketChannel.class;
+ group = EPOLL_CHANNEL;
+ AC_LOGGER.info("Using native transport.");
+ } else {
+ channel = NioServerSocketChannel.class;
+ group = DEFAULT_CHANNEL;
+ AC_LOGGER.info("Not using native transport due to " +
+ "it is either disabled in acron.json or not available.");
+ }
+ channels.add(new ServerBootstrap()
+ .channel(channel)
+ .childHandler(new AcronInitializer())
+ .group(group.get())
+ .localAddress(Config.getGlobalConfig().address(),
+ Config.getGlobalConfig().port())
+ .bind()
+ .syncUninterruptibly());
+
+ }
+}