mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-02 21:17:00 +01:00
1358d1e914
Upstream has released updates that appear to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing Bukkit Changes: 881e06e5 PR-725: Add Item Unlimited Lifetime APIs CraftBukkit Changes: 74c08312 SPIGOT-6962: Call EntityChangeBlockEvent when when FallingBlockEntity starts to fall 64db5126 SPIGOT-6959: Make /loot command ignore empty items for spawn 2d760831 Increase outdated build delay 9ed7e4fb SPIGOT-6138, SPIGOT-6415: Don't call CreatureSpawnEvent after cross-dimensional travel fc4ad813 SPIGOT-6895: Trees grown with applyBoneMeal() don't fire the StructureGrowthEvent 59733a2e SPIGOT-6961: Actually return a copy of the ItemMeta Spigot Changes: ffceeae3 SPIGOT-6956: Drop unload queue patch as attempt at fixing stop issue e19ddabd PR-1011: Add Item Unlimited Lifetime APIs 34d40b0e SPIGOT-2942: give command fires PlayerDropItemEvent, cancelling it causes Item Duplication
48 lines
2.3 KiB
Diff
48 lines
2.3 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Spottedleaf <spottedleaf@spottedleaf.dev>
|
|
Date: Fri, 24 Apr 2020 09:06:15 -0700
|
|
Subject: [PATCH] Make CallbackExecutor strict again
|
|
|
|
The correct fix for double scheduling is to avoid it. The reason
|
|
this class is used is because double scheduling causes issues
|
|
elsewhere, and it acts as an explicit detector of what double
|
|
schedules. Effectively, use the callback executor as a tool of
|
|
finding issues rather than hiding these issues.
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java
|
|
index 104e7d0c18b032ee8198c4de25a57676d0f64745..d53ff732a503eab3aea0384475f8a56d3076828d 100644
|
|
--- a/src/main/java/net/minecraft/server/level/ChunkMap.java
|
|
+++ b/src/main/java/net/minecraft/server/level/ChunkMap.java
|
|
@@ -164,17 +164,28 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
|
|
public final CallbackExecutor callbackExecutor = new CallbackExecutor();
|
|
public static final class CallbackExecutor implements java.util.concurrent.Executor, Runnable {
|
|
|
|
- private final java.util.Queue<Runnable> queue = new java.util.ArrayDeque<>();
|
|
+ private Runnable queued; // Paper - revert CB changes
|
|
|
|
@Override
|
|
public void execute(Runnable runnable) {
|
|
- this.queue.add(runnable);
|
|
+ // Paper start - revert CB changes
|
|
+ org.spigotmc.AsyncCatcher.catchOp("Callback Executor execute");
|
|
+ if (this.queued != null) {
|
|
+ LOGGER.error("Failed to schedule runnable", new IllegalStateException("Already queued"));
|
|
+ throw new IllegalStateException("Already queued");
|
|
+ }
|
|
+ this.queued = runnable;
|
|
+ // Paper end - revert CB changes
|
|
}
|
|
|
|
@Override
|
|
public void run() {
|
|
- Runnable task;
|
|
- while ((task = this.queue.poll()) != null) {
|
|
+ // Paper start - revert CB changes
|
|
+ org.spigotmc.AsyncCatcher.catchOp("Callback Executor execute");
|
|
+ Runnable task = this.queued;
|
|
+ if (task != null) {
|
|
+ this.queued = null;
|
|
+ // Paper end - revert CB changes
|
|
task.run();
|
|
}
|
|
}
|