diff --git a/README.md b/README.md index 7aa1e1aa..d958f874 100644 --- a/README.md +++ b/README.md @@ -230,6 +230,7 @@ See the patches list below. [FalchusSpigot-????] Fix MC-87 map scaling/cloning issues [FalchusSpigot-????] Fix view distance lookup [FalchusSpigot-????] Only send Dragon/Wither Death sounds to same world +[FalchusSpigot-????] Improve NetworkManager [DashSpigot-0033] Fix SPIGOT-1746: Tile entities may not always tick [DashSpigot-0011] Fix MC-94186: Dragon egg falling in lazy chunks diff --git a/WindSpigot-Server/src/main/java/net/minecraft/server/NetworkManager.java b/WindSpigot-Server/src/main/java/net/minecraft/server/NetworkManager.java index f666e62c..6cf7531f 100644 --- a/WindSpigot-Server/src/main/java/net/minecraft/server/NetworkManager.java +++ b/WindSpigot-Server/src/main/java/net/minecraft/server/NetworkManager.java @@ -3,7 +3,6 @@ import java.net.SocketAddress; import java.util.Iterator; import java.util.Queue; -import java.util.concurrent.locks.ReentrantReadWriteLock; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.Validate; @@ -61,7 +60,6 @@ public class NetworkManager extends SimpleChannelInboundHandler { private final EnumProtocolDirection h; private final Queue i = Queues.newConcurrentLinkedQueue(); - private final ReentrantReadWriteLock j = new ReentrantReadWriteLock(); public Channel channel; // Spigot Start // PAIL public SocketAddress l; @@ -235,13 +233,8 @@ public void handle(Packet packet) { // WindSpigot end this.dispatchPacket(packet, null, Boolean.TRUE); } else { - this.j.writeLock().lock(); - - try { - this.i.add(new NetworkManager.QueuedPacket(packet)); - } finally { - this.j.writeLock().unlock(); - } + // FalchusSpigot - remove unnecessary locks for packets (the packet queue is already thread safe) + this.i.add(new NetworkManager.QueuedPacket(packet)); } } @@ -253,13 +246,8 @@ public void a(Packet packet, GenericFutureListener packet, this.setProtocol(enumprotocol); } try { - ChannelFuture channelfuture1 = (flush) ? this.channel.writeAndFlush(packet) - : this.channel.write(packet); // Tuinity - add flush parameter + ChannelFuture channelfuture1 = this.channel.writeAndFlush(packet); // Tuinity - add flush parameter if (listeners != null) { channelfuture1.addListeners(listeners); } @@ -357,25 +344,21 @@ private void sendPacketQueue() { if (this.i.isEmpty()) { return; // [Nacho-0019] :: Avoid lock every packet send } - if (this.channel != null && this.channel.isOpen()) { - this.j.readLock().lock(); + if (this.channel != null && this.channel.isActive()) { + // FalchusSpigot - remove unnecessary locks for packets (the packet queue is already thread safe) boolean needsFlush = this.canFlush; boolean hasWrotePacket = false; - try { - Iterator iterator = this.i.iterator(); - while (iterator.hasNext()) { - QueuedPacket queued = iterator.next(); - Packet packet = queued.a; - if (hasWrotePacket && (needsFlush || this.canFlush)) { - flush(); - } - iterator.remove(); - this.dispatchPacket(packet, queued.b, - (!iterator.hasNext() && (needsFlush || this.canFlush)) ? Boolean.TRUE : Boolean.FALSE); - hasWrotePacket = true; + Iterator iterator = this.i.iterator(); + while (iterator.hasNext()) { + QueuedPacket queued = iterator.next(); + Packet packet = queued.a; + if (hasWrotePacket && (needsFlush || this.canFlush)) { + flush(); } - } finally { - this.j.readLock().unlock(); + iterator.remove(); + this.dispatchPacket(packet, queued.b, + (!iterator.hasNext() && (needsFlush || this.canFlush)) ? Boolean.TRUE : Boolean.FALSE); + hasWrotePacket = true; } } }