mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-13 10:21:13 +01:00
f44d237de9
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 CraftBukkit Changes: 5be41fb8 SPIGOT-6720: Fix bed explosion checks 09b99daf SPIGOT-6722: Close entity manager when unloading world 3a9561bf SPIGOT-6686: Changes in MaximumRepairCost for Anvil Rename cause inconsistency
37 lines
1.9 KiB
Diff
37 lines
1.9 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Spottedleaf <Spottedleaf@users.noreply.github.com>
|
|
Date: Sun, 21 Mar 2021 17:32:47 -0700
|
|
Subject: [PATCH] Correctly handle recursion for chunkholder updates
|
|
|
|
If a chunk ticket level is brought up while unloading it would
|
|
cause a recursive call which would handle the increase but then
|
|
the caller would think the chunk would be unloaded.
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/level/ChunkHolder.java b/src/main/java/net/minecraft/server/level/ChunkHolder.java
|
|
index e844ac574e4b94580a14027c130374f1287f7324..844a0e1ac3a6480c8d7b49debaada2c698432405 100644
|
|
--- a/src/main/java/net/minecraft/server/level/ChunkHolder.java
|
|
+++ b/src/main/java/net/minecraft/server/level/ChunkHolder.java
|
|
@@ -624,8 +624,10 @@ public class ChunkHolder {
|
|
playerchunkmap.onFullChunkStatusChange(this.pos, playerchunk_state);
|
|
}
|
|
|
|
+ protected long updateCount; // Paper - correctly handle recursion
|
|
protected void updateFutures(ChunkMap chunkStorage, Executor executor) {
|
|
ensureTickThread("Async ticket level update"); // Paper
|
|
+ long updateCount = ++this.updateCount; // Paper - correctly handle recursion
|
|
ChunkStatus chunkstatus = ChunkHolder.getStatus(this.oldTicketLevel);
|
|
ChunkStatus chunkstatus1 = ChunkHolder.getStatus(this.ticketLevel);
|
|
boolean flag = this.oldTicketLevel <= ChunkMap.MAX_CHUNK_DISTANCE;
|
|
@@ -667,6 +669,12 @@ public class ChunkHolder {
|
|
|
|
// Run callback right away if the future was already done
|
|
chunkStorage.callbackExecutor.run();
|
|
+ // Paper start - correctly handle recursion
|
|
+ if (this.updateCount != updateCount) {
|
|
+ // something else updated ticket level for us.
|
|
+ return;
|
|
+ }
|
|
+ // Paper end - correctly handle recursion
|
|
}
|
|
// CraftBukkit end
|
|
CompletableFuture completablefuture;
|