mirror of
https://github.com/PaperMC/Paper.git
synced 2025-01-01 17:01:56 +01:00
33246e0ba0
Fixed a few bugs, and made numerous improvements. Fixed issue where a sync chunk load could have its ticket removed and the priority ticket could expire... Still not perfect there but better than before. Also fixed few other misc issues such as watchdog cpu usage, chunk queue update had risk of double enqueue due to it no longer being a set. Added much more information about chunk state to watchdog prints. I see some more room for improvement even, but this is much better than before. Fixes #3407 Fixes #3411 Fixes #3395 Fixes #3389
74 lines
4 KiB
Diff
74 lines
4 KiB
Diff
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/ChunkMapDistance.java b/src/main/java/net/minecraft/server/ChunkMapDistance.java
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/net/minecraft/server/ChunkMapDistance.java
|
|
+++ b/src/main/java/net/minecraft/server/ChunkMapDistance.java
|
|
@@ -0,0 +0,0 @@ public abstract class ChunkMapDistance {
|
|
private final ChunkMapDistance.a e = new ChunkMapDistance.a();
|
|
private final ChunkMapDistance.b f = new ChunkMapDistance.b(8);
|
|
private final ChunkMapDistance.c g = new ChunkMapDistance.c(33);
|
|
- private final Set<PlayerChunk> pendingChunkUpdates = Sets.newHashSet();
|
|
+ // Paper start use a queue, but still keep unique requirement
|
|
+ public final java.util.Queue<PlayerChunk> pendingChunkUpdates = new java.util.ArrayDeque<PlayerChunk>() {
|
|
+ @Override
|
|
+ public boolean add(PlayerChunk o) {
|
|
+ if (o.isUpdateQueued) return true;
|
|
+ o.isUpdateQueued = true;
|
|
+ return super.add(o);
|
|
+ }
|
|
+ };
|
|
+ // Paper end
|
|
private final ChunkTaskQueueSorter i;
|
|
private final Mailbox<ChunkTaskQueueSorter.a<Runnable>> j;
|
|
private final Mailbox<ChunkTaskQueueSorter.b> k;
|
|
@@ -0,0 +0,0 @@ public abstract class ChunkMapDistance {
|
|
;
|
|
}
|
|
|
|
+ // Paper start
|
|
if (!this.pendingChunkUpdates.isEmpty()) {
|
|
- // CraftBukkit start
|
|
- // Iterate pending chunk updates with protection against concurrent modification exceptions
|
|
- java.util.Iterator<PlayerChunk> iter = this.pendingChunkUpdates.iterator();
|
|
- int expectedSize = this.pendingChunkUpdates.size();
|
|
- do {
|
|
- PlayerChunk playerchunk = iter.next();
|
|
- iter.remove();
|
|
- expectedSize--;
|
|
-
|
|
- playerchunk.a(playerchunkmap);
|
|
-
|
|
- // Reset iterator if set was modified using add()
|
|
- if (this.pendingChunkUpdates.size() != expectedSize) {
|
|
- expectedSize = this.pendingChunkUpdates.size();
|
|
- iter = this.pendingChunkUpdates.iterator();
|
|
- }
|
|
- } while (iter.hasNext());
|
|
- // CraftBukkit end
|
|
-
|
|
+ while(!this.pendingChunkUpdates.isEmpty()) {
|
|
+ PlayerChunk remove = this.pendingChunkUpdates.remove();
|
|
+ remove.isUpdateQueued = false;
|
|
+ remove.a(playerchunkmap);
|
|
+ }
|
|
+ // Paper end
|
|
return true;
|
|
} else {
|
|
if (!this.l.isEmpty()) {
|
|
diff --git a/src/main/java/net/minecraft/server/PlayerChunk.java b/src/main/java/net/minecraft/server/PlayerChunk.java
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/net/minecraft/server/PlayerChunk.java
|
|
+++ b/src/main/java/net/minecraft/server/PlayerChunk.java
|
|
@@ -0,0 +0,0 @@ public class PlayerChunk {
|
|
private static final CompletableFuture<Either<Chunk, PlayerChunk.Failure>> UNLOADED_CHUNK_FUTURE = CompletableFuture.completedFuture(PlayerChunk.UNLOADED_CHUNK);
|
|
private static final List<ChunkStatus> CHUNK_STATUSES = ChunkStatus.a();
|
|
private static final PlayerChunk.State[] CHUNK_STATES = PlayerChunk.State.values();
|
|
+ boolean isUpdateQueued = false; // Paper
|
|
private final AtomicReferenceArray<CompletableFuture<Either<IChunkAccess, PlayerChunk.Failure>>> statusFutures;
|
|
private volatile CompletableFuture<Either<Chunk, PlayerChunk.Failure>> fullChunkFuture; private int fullChunkCreateCount; private volatile boolean isFullChunkReady; // Paper - cache chunk ticking stage
|
|
private volatile CompletableFuture<Either<Chunk, PlayerChunk.Failure>> tickingFuture; private volatile boolean isTickingReady; // Paper - cache chunk ticking stage
|