fix: async packet processing

This commit is contained in:
Maurice Eisenblätter 2023-08-07 17:31:52 +02:00
parent b9e224db1c
commit 4195609611
No known key found for this signature in database
GPG Key ID: 2E553EFBAE92FB3A
3 changed files with 13 additions and 24 deletions

View File

@ -420,11 +420,15 @@ public class AsyncFilterManager implements AsynchronousManager {
AsyncListenerHandler handler = marker.getListenerTraversal().next().getListener();
if (!handler.isCancelled()) {
getProcessingQueue(packet).enqueue(packet, onMainThread);
marker.incrementProcessingDelay();
handler.enqueuePacket(packet);
return;
}
}
}
// There are no more listeners - queue the packet for transmission
signalFreeProcessingSlot(packet);
PacketSendingQueue queue = getSendingQueue(packet, false);

View File

@ -632,9 +632,6 @@ public class AsyncListenerHandler {
filterManager.getErrorReporter().reportMinimal(listener.getPlugin(), methodName, e);
}
// 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);
}

View File

@ -131,32 +131,20 @@ class PacketProcessingQueue extends AbstractConcurrentListenerMultimap<AsyncList
if (holder != null) {
PacketEvent packet = holder.getEvent();
AsyncMarker marker = packet.getAsyncMarker();
Iterator<PrioritizedListener<AsyncListenerHandler>> iterator = marker.getListenerTraversal();
Collection<PrioritizedListener<AsyncListenerHandler>> list = getListener(packet.getPacketType());
marker.incrementProcessingDelay();
if (iterator != null && iterator.hasNext()) {
AsyncListenerHandler handler = marker.getListenerTraversal().next().getListener();
if (!handler.isCancelled()) {
handler.enqueuePacket(packet);
// Yes, removing the marker will cause the chain to stop
if (list != null) {
Iterator<PrioritizedListener<AsyncListenerHandler>> iterator = list.iterator();
if (iterator.hasNext()) {
marker.setListenerTraversal(iterator);
iterator.next().getListener().enqueuePacket(packet);
continue;
}
}
if (iterator == null) {
Collection<PrioritizedListener<AsyncListenerHandler>> list = getListener(packet.getPacketType());
// Yes, removing the marker will cause the chain to stop
if (list != null) {
iterator = list.iterator();
if (iterator.hasNext()) {
marker.setListenerTraversal(iterator);
iterator.next().getListener().enqueuePacket(packet);
continue;
}
}
}
// The packet has no further listeners. Just send it.
if (marker.decrementProcessingDelay() == 0) {