163 lines
5.9 KiB
Diff
163 lines
5.9 KiB
Diff
|
From 406f92634ac7dd722529a93eb450c07a2a196351 Mon Sep 17 00:00:00 2001
|
||
|
From: Poweruser_rs <poweruser.rs@hotmail.com>
|
||
|
Date: Tue, 29 Mar 2016 15:48:18 +0200
|
||
|
Subject: [PATCH] Offload packet passing to netty channel eventloop
|
||
|
|
||
|
|
||
|
diff --git a/src/main/java/net/minecraft/server/NetworkManager.java b/src/main/java/net/minecraft/server/NetworkManager.java
|
||
|
index b35650ee0..474afb52a 100644
|
||
|
--- a/src/main/java/net/minecraft/server/NetworkManager.java
|
||
|
+++ b/src/main/java/net/minecraft/server/NetworkManager.java
|
||
|
@@ -28,6 +28,17 @@ import org.spigotmc.SpigotCompressor;
|
||
|
import org.spigotmc.SpigotDecompressor;
|
||
|
// Spigot end
|
||
|
|
||
|
+// Poweruser start
|
||
|
+import java.util.Collections;
|
||
|
+import java.util.concurrent.ConcurrentLinkedQueue;
|
||
|
+import java.util.concurrent.TimeUnit;
|
||
|
+import java.util.Collection;
|
||
|
+import java.util.HashMap;
|
||
|
+import java.util.Map;
|
||
|
+
|
||
|
+import net.minecraft.util.io.netty.channel.EventLoop;
|
||
|
+// Poweruser end
|
||
|
+
|
||
|
public class NetworkManager extends SimpleChannelInboundHandler {
|
||
|
|
||
|
private static final Logger i = LogManager.getLogger();
|
||
|
@@ -70,6 +81,35 @@ public class NetworkManager extends SimpleChannelInboundHandler {
|
||
|
|
||
|
public static final GenericFutureListener[] emptyListenerArray = new GenericFutureListener[0]; // Poweruser
|
||
|
|
||
|
+ // Poweruser start
|
||
|
+ private static final Map<EventLoop, PacketSender> senderTasks = Collections.synchronizedMap(new HashMap<EventLoop, NetworkManager.PacketSender>());
|
||
|
+ private PacketSender assignedPacketSender;
|
||
|
+
|
||
|
+ public static class PacketSender implements Runnable {
|
||
|
+
|
||
|
+ private Queue<QueuedPacket> commonPacketQueue = new ConcurrentLinkedQueue<QueuedPacket>();
|
||
|
+
|
||
|
+ private void queuePacket(QueuedPacket queuedPacket) {
|
||
|
+ this.commonPacketQueue.add(queuedPacket);
|
||
|
+ }
|
||
|
+
|
||
|
+ private void queuePackets(Collection<QueuedPacket> collection) {
|
||
|
+ this.commonPacketQueue.addAll(collection);
|
||
|
+ }
|
||
|
+
|
||
|
+ @Override
|
||
|
+ public void run() {
|
||
|
+ QueuedPacket packet = null;
|
||
|
+ while((packet = this.commonPacketQueue.poll()) != null) {
|
||
|
+ NetworkManager manager = QueuedPacket.getNetworkManager(packet);
|
||
|
+ if(manager.isConnected()) {
|
||
|
+ manager.b(QueuedPacket.a(packet), QueuedPacket.b(packet));
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ // Poweruser end
|
||
|
+
|
||
|
public NetworkManager(boolean flag) {
|
||
|
this.j = flag;
|
||
|
}
|
||
|
@@ -82,6 +122,18 @@ public class NetworkManager extends SimpleChannelInboundHandler {
|
||
|
this.preparing = false;
|
||
|
// Spigot End
|
||
|
this.a(EnumProtocol.HANDSHAKING);
|
||
|
+ // Poweruser start
|
||
|
+ EventLoop eventLoop = this.m.eventLoop();
|
||
|
+ PacketSender sender;
|
||
|
+ if(senderTasks.containsKey(eventLoop)) {
|
||
|
+ sender = senderTasks.get(eventLoop);
|
||
|
+ } else {
|
||
|
+ sender = new NetworkManager.PacketSender();
|
||
|
+ senderTasks.put(eventLoop, sender);
|
||
|
+ eventLoop.scheduleAtFixedRate(sender, 5L, 5L, TimeUnit.MILLISECONDS);
|
||
|
+ }
|
||
|
+ this.assignedPacketSender = sender;
|
||
|
+ // Poweruser end
|
||
|
}
|
||
|
|
||
|
public void a(EnumProtocol enumprotocol) {
|
||
|
@@ -126,12 +178,26 @@ public class NetworkManager extends SimpleChannelInboundHandler {
|
||
|
}
|
||
|
|
||
|
public void handle(Packet packet, GenericFutureListener... agenericfuturelistener) {
|
||
|
+ /*
|
||
|
if (this.m != null && this.m.isOpen()) {
|
||
|
this.i();
|
||
|
this.b(packet, agenericfuturelistener);
|
||
|
} else {
|
||
|
this.l.add(new QueuedPacket(packet, agenericfuturelistener));
|
||
|
}
|
||
|
+ */
|
||
|
+ // Poweruser start
|
||
|
+ QueuedPacket queuedpacket = new QueuedPacket(this, packet, agenericfuturelistener);
|
||
|
+ if(this.assignedPacketSender != null && this.isConnected()) {
|
||
|
+ if(!this.l.isEmpty()) {
|
||
|
+ this.assignedPacketSender.queuePackets(this.l);
|
||
|
+ this.l.clear();
|
||
|
+ }
|
||
|
+ this.assignedPacketSender.queuePacket(queuedpacket);
|
||
|
+ } else {
|
||
|
+ this.l.add(queuedpacket);
|
||
|
+ }
|
||
|
+ // Poweruser end
|
||
|
}
|
||
|
|
||
|
private void b(Packet packet, GenericFutureListener[] agenericfuturelistener) {
|
||
|
@@ -168,7 +234,7 @@ public class NetworkManager extends SimpleChannelInboundHandler {
|
||
|
}
|
||
|
|
||
|
public void a() {
|
||
|
- this.i();
|
||
|
+ //this.i(); // Poweruser - done through PacketSender
|
||
|
EnumProtocol enumprotocol = (EnumProtocol) this.m.attr(d).get();
|
||
|
|
||
|
if (this.p != enumprotocol) {
|
||
|
@@ -195,8 +261,7 @@ public class NetworkManager extends SimpleChannelInboundHandler {
|
||
|
|
||
|
this.o.a();
|
||
|
}
|
||
|
-
|
||
|
- this.m.flush();
|
||
|
+ //this.m.flush(); // Poweruser - done through PacketSender
|
||
|
}
|
||
|
|
||
|
public SocketAddress getSocketAddress() {
|
||
|
@@ -204,6 +269,7 @@ public class NetworkManager extends SimpleChannelInboundHandler {
|
||
|
}
|
||
|
|
||
|
public void close(IChatBaseComponent ichatbasecomponent) {
|
||
|
+ this.assignedPacketSender = null; // Poweruser
|
||
|
// Spigot Start
|
||
|
this.preparing = false;
|
||
|
this.k.clear(); // Spigot Update - 20140921a
|
||
|
diff --git a/src/main/java/net/minecraft/server/QueuedPacket.java b/src/main/java/net/minecraft/server/QueuedPacket.java
|
||
|
index fdebf9dd3..06480afef 100644
|
||
|
--- a/src/main/java/net/minecraft/server/QueuedPacket.java
|
||
|
+++ b/src/main/java/net/minecraft/server/QueuedPacket.java
|
||
|
@@ -8,7 +8,16 @@ class QueuedPacket {
|
||
|
private final Packet a;
|
||
|
private final GenericFutureListener[] b;
|
||
|
|
||
|
- public QueuedPacket(Packet packet, GenericFutureListener... agenericfuturelistener) {
|
||
|
+ // Poweruser start
|
||
|
+ private final NetworkManager manager;
|
||
|
+
|
||
|
+ static NetworkManager getNetworkManager(QueuedPacket queuedpacket) {
|
||
|
+ return queuedpacket.manager;
|
||
|
+ }
|
||
|
+
|
||
|
+ public QueuedPacket(NetworkManager manager, Packet packet, GenericFutureListener... agenericfuturelistener) {
|
||
|
+ this.manager = manager;
|
||
|
+ // Poweruser end
|
||
|
this.a = packet;
|
||
|
this.b = agenericfuturelistener;
|
||
|
}
|
||
|
--
|
||
|
2.13.3
|
||
|
|