From 19d9d39eac62baef40b67e333d36fe62dec3d3f2 Mon Sep 17 00:00:00 2001 From: md_5 Date: Sun, 19 Apr 2015 20:20:50 +1000 Subject: [PATCH] Use CLQ for main thread tasks. Means netty threads aren't blocked for long synchronisations whilst tasks are running. --- .../0158-Use-CLQ-for-main-thread-tasks.patch | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 CraftBukkit-Patches/0158-Use-CLQ-for-main-thread-tasks.patch diff --git a/CraftBukkit-Patches/0158-Use-CLQ-for-main-thread-tasks.patch b/CraftBukkit-Patches/0158-Use-CLQ-for-main-thread-tasks.patch new file mode 100644 index 0000000000..b249804af8 --- /dev/null +++ b/CraftBukkit-Patches/0158-Use-CLQ-for-main-thread-tasks.patch @@ -0,0 +1,54 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: md_5 +Date: Sun, 19 Apr 2015 09:19:39 +1000 +Subject: [PATCH] Use CLQ for main thread tasks. + + +diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java +index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 +--- a/src/main/java/net/minecraft/server/MinecraftServer.java ++++ b/src/main/java/net/minecraft/server/MinecraftServer.java +@@ -0,0 +0,0 @@ public abstract class MinecraftServer implements Runnable, ICommandListener, IAs + private long X = 0L; + private final GameProfileRepository Y; + private final UserCache Z; +- protected final Queue> j = Queues.newArrayDeque(); ++ protected final Queue> j = new java.util.concurrent.ConcurrentLinkedQueue>(); // Spigot, PAIL: Rename + private Thread serverThread; + private long ab = ay(); + +@@ -0,0 +0,0 @@ public abstract class MinecraftServer implements Runnable, ICommandListener, IAs + this.methodProfiler.a("jobs"); + Queue queue = this.j; + +- synchronized (this.j) { +- while (!this.j.isEmpty()) { +- SystemUtils.a((FutureTask) this.j.poll(), MinecraftServer.LOGGER); +- } +- } ++ // Spigot start ++ FutureTask entry; ++ int count = this.j.size(); ++ while ((entry = this.j.poll()) != null && count-- > 0) { ++ SystemUtils.a(entry, MinecraftServer.LOGGER); ++ } ++ // Spigot end + + this.methodProfiler.c("levels"); + +@@ -0,0 +0,0 @@ public abstract class MinecraftServer implements Runnable, ICommandListener, IAs + ListenableFutureTask listenablefuturetask = ListenableFutureTask.create(callable); + Queue queue = this.j; + +- synchronized (this.j) { +- this.j.add(listenablefuturetask); +- return listenablefuturetask; +- } ++ // Spigot start ++ this.j.add(listenablefuturetask); ++ return listenablefuturetask; ++ // Spigot end + } else { + try { + return Futures.immediateFuture(callable.call()); +-- \ No newline at end of file