Paper/patches/server/0014-ChunkMapDistance-CME.patch

85 Zeilen
4.2 KiB
Diff

2021-06-11 14:02:28 +02:00
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Shane Freeder <theboyetronic@gmail.com>
Date: Wed, 29 May 2019 04:01:22 +0100
Subject: [PATCH] ChunkMapDistance CME
diff --git a/src/main/java/net/minecraft/server/level/ChunkHolder.java b/src/main/java/net/minecraft/server/level/ChunkHolder.java
index 0873134f1f6de0c372ba28b89a20302c9a0115d8..e30893d6cbe3b42338d04453d0f452babeb61d8a 100644
2021-06-11 14:02:28 +02:00
--- a/src/main/java/net/minecraft/server/level/ChunkHolder.java
+++ b/src/main/java/net/minecraft/server/level/ChunkHolder.java
2022-03-01 06:43:03 +01:00
@@ -73,6 +73,7 @@ public class ChunkHolder {
2021-06-13 14:43:56 +02:00
private boolean resendLight;
private CompletableFuture<Void> pendingFullStateConfirmation;
2021-06-11 14:02:28 +02:00
+ boolean isUpdateQueued = false; // Paper
2021-06-13 14:43:56 +02:00
private final ChunkMap chunkMap; // Paper
// Paper start
2021-06-11 14:02:28 +02:00
diff --git a/src/main/java/net/minecraft/server/level/DistanceManager.java b/src/main/java/net/minecraft/server/level/DistanceManager.java
index f08089b8672454acf8c2309e850466b335248692..6181f675d7addde30f7018b4cd46fe061a14da51 100644
2021-06-11 14:02:28 +02:00
--- a/src/main/java/net/minecraft/server/level/DistanceManager.java
+++ b/src/main/java/net/minecraft/server/level/DistanceManager.java
2022-03-01 06:43:03 +01:00
@@ -52,7 +52,16 @@ public abstract class DistanceManager {
2021-06-11 14:02:28 +02:00
private final DistanceManager.FixedPlayerDistanceChunkTracker naturalSpawnChunkCounter = new DistanceManager.FixedPlayerDistanceChunkTracker(8);
2021-11-24 05:25:34 +01:00
private final TickingTracker tickingTicketsTracker = new TickingTracker();
2021-06-11 14:02:28 +02:00
private final DistanceManager.PlayerTicketTracker playerTicketManager = new DistanceManager.PlayerTicketTracker(33);
2021-06-13 14:43:56 +02:00
- final Set<ChunkHolder> chunksToUpdateFutures = Sets.newHashSet();
2021-06-11 14:02:28 +02:00
+ // Paper start use a queue, but still keep unique requirement
+ public final java.util.Queue<ChunkHolder> pendingChunkUpdates = new java.util.ArrayDeque<ChunkHolder>() {
+ @Override
+ public boolean add(ChunkHolder o) {
+ if (o.isUpdateQueued) return true;
+ o.isUpdateQueued = true;
+ return super.add(o);
+ }
+ };
+ // Paper end
2021-06-13 14:43:56 +02:00
final ChunkTaskPriorityQueueSorter ticketThrottler;
final ProcessorHandle<ChunkTaskPriorityQueueSorter.Message<Runnable>> ticketThrottlerInput;
final ProcessorHandle<ChunkTaskPriorityQueueSorter.Release> ticketThrottlerReleaser;
2022-03-01 06:43:03 +01:00
@@ -127,26 +136,14 @@ public abstract class DistanceManager {
2021-06-11 14:02:28 +02:00
;
}
- if (!this.chunksToUpdateFutures.isEmpty()) {
- // CraftBukkit start
- // Iterate pending chunk updates with protection against concurrent modification exceptions
- java.util.Iterator<ChunkHolder> iter = this.chunksToUpdateFutures.iterator();
- int expectedSize = this.chunksToUpdateFutures.size();
- do {
- ChunkHolder playerchunk = iter.next();
- iter.remove();
- expectedSize--;
-
2021-11-24 05:25:34 +01:00
- playerchunk.updateFutures(chunkStorage, this.mainThreadExecutor);
2021-06-11 14:02:28 +02:00
-
- // Reset iterator if set was modified using add()
- if (this.chunksToUpdateFutures.size() != expectedSize) {
- expectedSize = this.chunksToUpdateFutures.size();
- iter = this.chunksToUpdateFutures.iterator();
- }
- } while (iter.hasNext());
- // CraftBukkit end
-
+ // Paper start
+ if (!this.pendingChunkUpdates.isEmpty()) {
+ while(!this.pendingChunkUpdates.isEmpty()) {
+ ChunkHolder remove = this.pendingChunkUpdates.remove();
+ remove.isUpdateQueued = false;
2021-11-24 05:25:34 +01:00
+ remove.updateFutures(chunkStorage, this.mainThreadExecutor);
2021-06-11 14:02:28 +02:00
+ }
+ // Paper end
return true;
} else {
if (!this.ticketsToRelease.isEmpty()) {
2022-03-01 06:43:03 +01:00
@@ -471,7 +468,7 @@ public abstract class DistanceManager {
2021-06-11 14:02:28 +02:00
if (k != level) {
playerchunk = DistanceManager.this.updateChunkScheduling(id, level, playerchunk, k);
if (playerchunk != null) {
- DistanceManager.this.chunksToUpdateFutures.add(playerchunk);
+ DistanceManager.this.pendingChunkUpdates.add(playerchunk);
}
}