-
-
Notifications
You must be signed in to change notification settings - Fork 2.4k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Avoid potential place where the world map could be modified after its…
… iterator is created (#8315)
- Loading branch information
1 parent
3996e6e
commit d332623
Showing
1 changed file
with
65 additions
and
0 deletions.
There are no files selected for viewing
65 changes: 65 additions & 0 deletions
65
patches/server/0900-Throw-exception-on-world-create-unload-while-being-t.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,65 @@ | ||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 | ||
From: Jake Potrebic <[email protected]> | ||
Date: Tue, 22 Mar 2022 12:44:30 -0700 | ||
Subject: [PATCH] Throw exception on world create/unload while being ticked | ||
|
||
There are no plans to support creating worlds while worlds are | ||
being ticked themselves. | ||
|
||
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java | ||
index 4d920031300a9801debc2eb39a4d3cb9d8fbb330..db3d34f0ad2baa2b8685c039a1de162c1b5ec212 100644 | ||
--- a/src/main/java/net/minecraft/server/MinecraftServer.java | ||
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java | ||
@@ -297,6 +297,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa | ||
|
||
public volatile Thread shutdownThread; // Paper | ||
public volatile boolean abnormalExit = false; // Paper | ||
+ public boolean isIteratingOverLevels = false; // Paper | ||
|
||
public static <S extends MinecraftServer> S spin(Function<Thread, S> serverFactory) { | ||
AtomicReference<S> atomicreference = new AtomicReference(); | ||
@@ -1495,7 +1496,6 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa | ||
this.getFunctions().tick(); | ||
MinecraftTimings.commandFunctionsTimer.stopTiming(); // Spigot // Paper | ||
this.profiler.popPush("levels"); | ||
- Iterator iterator = this.getAllLevels().iterator(); | ||
|
||
// CraftBukkit start | ||
// Run tasks that are waiting on processing | ||
@@ -1527,6 +1527,8 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa | ||
// Paper end | ||
MinecraftTimings.timeUpdateTimer.stopTiming(); // Spigot // Paper | ||
|
||
+ this.isIteratingOverLevels = true; // Paper | ||
+ Iterator iterator = this.getAllLevels().iterator(); // Paper - move down | ||
while (iterator.hasNext()) { | ||
ServerLevel worldserver = (ServerLevel) iterator.next(); | ||
worldserver.hasPhysicsEvent = org.bukkit.event.block.BlockPhysicsEvent.getHandlerList().getRegisteredListeners().length > 0; // Paper | ||
@@ -1574,6 +1576,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa | ||
this.profiler.pop(); | ||
worldserver.explosionDensityCache.clear(); // Paper - Optimize explosions | ||
} | ||
+ this.isIteratingOverLevels = false; // Paper | ||
|
||
this.profiler.popPush("connection"); | ||
MinecraftTimings.connectionTimer.startTiming(); // Spigot | ||
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java | ||
index 81eedf4812b654bd068a00e7f0e63ae6388dfe31..b867d19113862300968a54cb3d6926bef2d04e69 100644 | ||
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java | ||
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java | ||
@@ -1139,6 +1139,7 @@ public final class CraftServer implements Server { | ||
@Override | ||
public World createWorld(WorldCreator creator) { | ||
Preconditions.checkState(this.console.getAllLevels().iterator().hasNext(), "Cannot create additional worlds on STARTUP"); | ||
+ Preconditions.checkState(!this.console.isIteratingOverLevels, "Cannot create a world while worlds are being ticked"); // Paper | ||
Validate.notNull(creator, "Creator may not be null"); | ||
|
||
String name = creator.name(); | ||
@@ -1263,6 +1264,7 @@ public final class CraftServer implements Server { | ||
|
||
@Override | ||
public boolean unloadWorld(World world, boolean save) { | ||
+ Preconditions.checkState(!this.console.isIteratingOverLevels, "Cannot unload a world while worlds are being ticked"); // Paper | ||
if (world == null) { | ||
return false; | ||
} |