From f0401acd2f498a0d41de2362abddb8427e2e3525 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maurice=20Eisenbl=C3=A4tter?= Date: Sun, 27 Aug 2023 17:11:37 +0200 Subject: [PATCH] Improve async packet processing logic (#2503) * fix: enqueue async packet event after processing delay is zero * fix: async packet processing --- .../protocol/async/AsyncFilterManager.java | 17 +++++++++++++++++ .../protocol/async/AsyncListenerHandler.java | 15 --------------- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/comphenix/protocol/async/AsyncFilterManager.java b/src/main/java/com/comphenix/protocol/async/AsyncFilterManager.java index 1c74bea3..7765b0d3 100644 --- a/src/main/java/com/comphenix/protocol/async/AsyncFilterManager.java +++ b/src/main/java/com/comphenix/protocol/async/AsyncFilterManager.java @@ -413,6 +413,23 @@ public class AsyncFilterManager implements AsynchronousManager { // Only send if the packet is ready if (marker.decrementProcessingDelay() == 0) { + + // Now, get the next non-cancelled listener + if (!marker.hasExpired()) { + for (; marker.getListenerTraversal().hasNext(); ) { + AsyncListenerHandler handler = marker.getListenerTraversal().next().getListener(); + + if (!handler.isCancelled()) { + marker.incrementProcessingDelay(); + handler.enqueuePacket(packet); + return; + } + } + } + + // There are no more listeners - queue the packet for transmission + signalFreeProcessingSlot(packet); + PacketSendingQueue queue = getSendingQueue(packet, false); // No need to create a new queue if the player has logged out diff --git a/src/main/java/com/comphenix/protocol/async/AsyncListenerHandler.java b/src/main/java/com/comphenix/protocol/async/AsyncListenerHandler.java index fdddaa3b..79094015 100644 --- a/src/main/java/com/comphenix/protocol/async/AsyncListenerHandler.java +++ b/src/main/java/com/comphenix/protocol/async/AsyncListenerHandler.java @@ -632,21 +632,6 @@ public class AsyncListenerHandler { filterManager.getErrorReporter().reportMinimal(listener.getPlugin(), methodName, e); } - // Now, get the next non-cancelled listener - if (!marker.hasExpired()) { - for (; marker.getListenerTraversal().hasNext(); ) { - AsyncListenerHandler handler = marker.getListenerTraversal().next().getListener(); - - if (!handler.isCancelled()) { - handler.enqueuePacket(packet); - return; - } - } - } - - // There are no more listeners - queue the packet for transmission - filterManager.signalFreeProcessingSlot(packet); - // Note that listeners can opt to delay the packet transmission filterManager.signalPacketTransmission(packet); }