From b8d8a1856f33619a0300b9f519978de56d84abb4 Mon Sep 17 00:00:00 2001 From: ishland Date: Thu, 2 May 2024 00:07:39 +0800 Subject: [PATCH] fix: wait for channel reregistration if possible Fixes #62 --- .../eventloops/MixinClientConnection.java | 30 +++++++++++-------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/ishland/vmp/mixins/networking/eventloops/MixinClientConnection.java b/src/main/java/com/ishland/vmp/mixins/networking/eventloops/MixinClientConnection.java index 3d0aad7..0d1c71e 100644 --- a/src/main/java/com/ishland/vmp/mixins/networking/eventloops/MixinClientConnection.java +++ b/src/main/java/com/ishland/vmp/mixins/networking/eventloops/MixinClientConnection.java @@ -25,7 +25,7 @@ public class MixinClientConnection { @Shadow private volatile @Nullable PacketListener packetListener; - @Inject(method = "setPacketListener", at = @At(value = "RETURN")) + @Inject(method = "transitionInbound", at = @At(value = "RETURN")) private void onSetState(NetworkState state, PacketListener listener, CallbackInfo ci) { // if (this.channel.config() == instance) { // final EventLoopGroup group = VMPEventLoops.getEventLoopGroup(this.channel, state); @@ -40,7 +40,7 @@ private void onSetState(NetworkState state, PacketListener listener, Callback // } final EventLoopGroup group = VMPEventLoops.getEventLoopGroup(this.channel, state.id()); if (group != null) { - reregister(group); + vmp$reregister(group); } } @@ -50,7 +50,8 @@ private void onSetState(NetworkState state, PacketListener listener, Callback @Unique private EventLoopGroup pendingReregistration = null; - private synchronized void reregister(EventLoopGroup group) { + @Unique + private synchronized void vmp$reregister(EventLoopGroup group) { if (isReregistering) { pendingReregistration = group; return; @@ -69,18 +70,23 @@ private synchronized void reregister(EventLoopGroup group) { } }); promise.addListener(future -> { - isReregistering = false; - if (future.isSuccess()) { + synchronized (this) { + isReregistering = false; + if (future.isSuccess()) { // System.out.println("Reregistered " + this.channel); - this.channel.config().setAutoRead(true); - } else { - this.channel.pipeline().fireExceptionCaught(future.cause()); - } - if (pendingReregistration != null) { - reregister(pendingReregistration); - pendingReregistration = null; + this.channel.config().setAutoRead(true); + } else { + this.channel.pipeline().fireExceptionCaught(future.cause()); + } + if (pendingReregistration != null) { + vmp$reregister(pendingReregistration); + pendingReregistration = null; + } } }); + if (!promise.channel().eventLoop().inEventLoop()) { + promise.syncUninterruptibly(); + } } }