Simple patch changes for chunk system

Major ones soon
This commit is contained in:
Spottedleaf 2022-08-10 08:07:49 -07:00
parent 53885ac491
commit e48774fd72
2 changed files with 52 additions and 5 deletions

View file

@ -14,7 +14,9 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+package io.papermc.paper.util; +package io.papermc.paper.util;
+ +
+import net.minecraft.server.MinecraftServer; +import net.minecraft.server.MinecraftServer;
+import net.minecraft.world.entity.Entity;
+import org.bukkit.Bukkit; +import org.bukkit.Bukkit;
+import java.util.concurrent.atomic.AtomicInteger;
+ +
+public final class TickThread extends Thread { +public final class TickThread extends Thread {
+ +
@ -33,9 +35,22 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ ensureTickThread(reason); + ensureTickThread(reason);
+ } + }
+ +
+
+ public static void ensureTickThread(final String reason) { + public static void ensureTickThread(final String reason) {
+ if (!Bukkit.isPrimaryThread()) { + if (!isTickThread()) {
+ MinecraftServer.LOGGER.error("Thread " + Thread.currentThread().getName() + " failed main thread check: " + reason, new Throwable());
+ throw new IllegalStateException(reason);
+ }
+ }
+
+ public static void ensureTickThread(final int chunkX, final int chunkZ, final String reason) {
+ if (!isTickThreadFor(chunkX, chunkZ)) {
+ MinecraftServer.LOGGER.error("Thread " + Thread.currentThread().getName() + " failed main thread check: " + reason, new Throwable());
+ throw new IllegalStateException(reason);
+ }
+ }
+
+ public static void ensureTickThread(final Entity entity, final String reason) {
+ if (!isTickThreadFor(entity.chunkPosition().x, entity.chunkPosition().z)) {
+ MinecraftServer.LOGGER.error("Thread " + Thread.currentThread().getName() + " failed main thread check: " + reason, new Throwable()); + MinecraftServer.LOGGER.error("Thread " + Thread.currentThread().getName() + " failed main thread check: " + reason, new Throwable());
+ throw new IllegalStateException(reason); + throw new IllegalStateException(reason);
+ } + }
@ -43,7 +58,17 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ +
+ public final int id; /* We don't override getId as the spec requires that it be unique (with respect to all other threads) */ + public final int id; /* We don't override getId as the spec requires that it be unique (with respect to all other threads) */
+ +
+ public TickThread(final Runnable run, final String name, final int id) { + private static final AtomicInteger ID_GENERATOR = new AtomicInteger();
+
+ public TickThread(final String name) {
+ this(null, name);
+ }
+
+ public TickThread(final Runnable run, final String name) {
+ this(run, name, ID_GENERATOR.incrementAndGet());
+ }
+
+ private TickThread(final Runnable run, final String name, final int id) {
+ super(run, name); + super(run, name);
+ this.id = id; + this.id = id;
+ } + }
@ -51,6 +76,18 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ public static TickThread getCurrentTickThread() { + public static TickThread getCurrentTickThread() {
+ return (TickThread)Thread.currentThread(); + return (TickThread)Thread.currentThread();
+ } + }
+
+ public static boolean isTickThread() {
+ return Bukkit.isPrimaryThread();
+ }
+
+ public static boolean isTickThreadFor(final int chunkX, final int chunkZ) {
+ return Bukkit.isPrimaryThread();
+ }
+
+ public static boolean isTickThreadFor(final Entity entity) {
+ return Bukkit.isPrimaryThread();
+ }
+} +}
diff --git a/src/main/java/org/spigotmc/AsyncCatcher.java b/src/main/java/org/spigotmc/AsyncCatcher.java diff --git a/src/main/java/org/spigotmc/AsyncCatcher.java b/src/main/java/org/spigotmc/AsyncCatcher.java
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644

View file

@ -11,6 +11,16 @@ diff --git a/src/main/java/net/minecraft/world/level/chunk/storage/RegionFile.ja
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/src/main/java/net/minecraft/world/level/chunk/storage/RegionFile.java --- a/src/main/java/net/minecraft/world/level/chunk/storage/RegionFile.java
+++ b/src/main/java/net/minecraft/world/level/chunk/storage/RegionFile.java +++ b/src/main/java/net/minecraft/world/level/chunk/storage/RegionFile.java
@@ -0,0 +0,0 @@ public class RegionFile implements AutoCloseable {
}
}
+
+ public static final int MAX_CHUNK_SIZE = 500 * 1024 * 1024; // Paper - don't write garbage data to disk if writing serialization fails
+
// Paper end
private class ChunkBuffer extends ByteArrayOutputStream {
@@ -0,0 +0,0 @@ public class RegionFile implements AutoCloseable { @@ -0,0 +0,0 @@ public class RegionFile implements AutoCloseable {
this.pos = chunkcoordintpair; this.pos = chunkcoordintpair;
} }
@ -18,7 +28,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ // Paper start - don't write garbage data to disk if writing serialization fails + // Paper start - don't write garbage data to disk if writing serialization fails
+ @Override + @Override
+ public void write(final int b) { + public void write(final int b) {
+ if (this.count > 500_000_000) { + if (this.count > MAX_CHUNK_SIZE) {
+ throw new RegionFileStorage.RegionFileSizeException("Region file too large: " + this.count); + throw new RegionFileStorage.RegionFileSizeException("Region file too large: " + this.count);
+ } + }
+ super.write(b); + super.write(b);
@ -26,7 +36,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ +
+ @Override + @Override
+ public void write(final byte[] b, final int off, final int len) { + public void write(final byte[] b, final int off, final int len) {
+ if (this.count + len > 500_000_000) { + if (this.count + len > MAX_CHUNK_SIZE) {
+ throw new RegionFileStorage.RegionFileSizeException("Region file too large: " + (this.count + len)); + throw new RegionFileStorage.RegionFileSizeException("Region file too large: " + (this.count + len));
+ } + }
+ super.write(b, off, len); + super.write(b, off, len);