Don't flush packet queue off main thread

Increases risk of deadlock if a plugin using protocollib sends a packet
async, and then a listener then reads world state, and main thread is then
blocked waiting for the queue to flush.

This will break out of the synchronized block when it jumps to the netty event loop.

See: https://gist.github.com/aikar/e7abb2ba7059149d0a91f7a226e98590
This commit is contained in:
Aikar 2020-05-04 03:07:04 -04:00
parent a4ed58a9ab
commit 1abd2bd279
No known key found for this signature in database
GPG key ID: 401ADFC9891FAAFE

View file

@ -1,4 +1,4 @@
From 57f98e2c510b576b4d3c94b12384b1bc4b6b5e33 Mon Sep 17 00:00:00 2001
From 10a32d733a851719edd4c52fc25d673f1e3be4fd Mon Sep 17 00:00:00 2001
From: Aikar <aikar@aikar.co>
Date: Sat, 2 Mar 2019 14:55:01 -0500
Subject: [PATCH] Handle Excessive Signs in Chunks creating large packets
@ -14,7 +14,7 @@ With further contributions from
Co-Authored-by: Spottedleaf <spottedleaf@spottedleaf.dev>
diff --git a/src/main/java/net/minecraft/server/NetworkManager.java b/src/main/java/net/minecraft/server/NetworkManager.java
index b1dededc15..e966b6edcc 100644
index b1dededc15..07e3ddb6e9 100644
--- a/src/main/java/net/minecraft/server/NetworkManager.java
+++ b/src/main/java/net/minecraft/server/NetworkManager.java
@@ -158,19 +158,55 @@ public class NetworkManager extends SimpleChannelInboundHandler<Packet<?>> {
@ -73,7 +73,7 @@ index b1dededc15..e966b6edcc 100644
+
+ this.packetQueue.addAll(packets); // atomic
+ }
+ this.sendPacketQueue(); // ensure only one flush call is made
+ if (MCUtil.isMainThread()) this.sendPacketQueue();
+ // Paper end
}