spigot/CraftBukkit-Patches/0006-Async-Operation-Catching.patch

277 lines
15 KiB
Diff
Raw Normal View History

2025-04-13 10:28:23 +10:00
From 7debde8cd014665aded14729352101e62fcf5fc9 Mon Sep 17 00:00:00 2001
From: md_5 <git@md-5.net>
Date: Tue, 25 Mar 2014 16:10:01 +1100
Subject: [PATCH] Async Operation Catching
Catch and throw an exception when a potentially unsafe operation occurs on a thread other than the main server thread.
2025-01-25 20:00:02 +11:00
diff --git a/src/main/java/net/minecraft/server/level/ChunkMapDistance.java b/src/main/java/net/minecraft/server/level/ChunkMapDistance.java
2025-03-26 03:05:00 +11:00
index 59c7df2e2..3aa1dc69d 100644
2025-01-25 20:00:02 +11:00
--- a/src/main/java/net/minecraft/server/level/ChunkMapDistance.java
+++ b/src/main/java/net/minecraft/server/level/ChunkMapDistance.java
2025-03-26 03:05:00 +11:00
@@ -66,6 +66,7 @@ public abstract class ChunkMapDistance {
2025-01-25 20:00:02 +11:00
protected abstract PlayerChunk updateChunkScheduling(long i, int j, @Nullable PlayerChunk playerchunk, int k);
public boolean runAllUpdates(PlayerChunkMap playerchunkmap) {
+ org.spigotmc.AsyncCatcher.catchOp("chunk updates"); // Spigot
this.naturalSpawnChunkCounter.runAllUpdates();
2025-03-26 03:05:00 +11:00
this.simulationChunkTracker.runAllUpdates();
2025-01-25 20:00:02 +11:00
this.playerTicketManager.runAllUpdates();
2025-03-26 03:05:00 +11:00
@@ -240,6 +241,7 @@ public abstract class ChunkMapDistance {
@Override
protected void setLevel(long i, int j) {
+ org.spigotmc.AsyncCatcher.catchOp("chunk level update"); // Spigot
2025-03-26 03:05:00 +11:00
byte b0;
2025-03-26 03:05:00 +11:00
if (j > this.maxDistance) {
2021-03-16 09:00:00 +11:00
diff --git a/src/main/java/net/minecraft/server/level/PlayerChunkMap.java b/src/main/java/net/minecraft/server/level/PlayerChunkMap.java
2025-03-26 03:05:00 +11:00
index d4bf5c5d8..7eea04eb5 100644
2021-03-16 09:00:00 +11:00
--- a/src/main/java/net/minecraft/server/level/PlayerChunkMap.java
+++ b/src/main/java/net/minecraft/server/level/PlayerChunkMap.java
2024-10-23 02:15:00 +11:00
@@ -1249,6 +1249,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.b, Gener
}
2019-04-23 12:00:00 +10:00
protected void addEntity(Entity entity) {
+ org.spigotmc.AsyncCatcher.catchOp("entity track"); // Spigot
2019-04-23 12:00:00 +10:00
if (!(entity instanceof EntityComplexPart)) {
2021-11-22 09:00:00 +11:00
EntityTypes<?> entitytypes = entity.getType();
int i = entitytypes.clientTrackingRange() * 16;
2024-10-23 02:15:00 +11:00
@@ -1284,6 +1285,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.b, Gener
}
2019-04-23 12:00:00 +10:00
protected void removeEntity(Entity entity) {
+ org.spigotmc.AsyncCatcher.catchOp("entity untrack"); // Spigot
2024-04-24 01:15:00 +10:00
if (entity instanceof EntityPlayer entityplayer) {
this.updatePlayerStatus(entityplayer, false);
ObjectIterator objectiterator = this.entityMap.values().iterator();
2025-03-26 03:05:00 +11:00
@@ -1493,6 +1495,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.b, Gener
2019-04-23 12:00:00 +10:00
}
2021-11-22 09:00:00 +11:00
public void removePlayer(EntityPlayer entityplayer) {
+ org.spigotmc.AsyncCatcher.catchOp("player tracker clear"); // Spigot
2021-06-11 15:00:00 +10:00
if (this.seenBy.remove(entityplayer.connection)) {
2021-11-22 09:00:00 +11:00
this.serverEntity.removePairing(entityplayer);
2019-04-23 12:00:00 +10:00
}
2025-03-26 03:05:00 +11:00
@@ -1500,6 +1503,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.b, Gener
2019-04-23 12:00:00 +10:00
}
2019-04-23 12:00:00 +10:00
public void updatePlayer(EntityPlayer entityplayer) {
+ org.spigotmc.AsyncCatcher.catchOp("player tracker update"); // Spigot
2021-06-11 15:00:00 +10:00
if (entityplayer != this.entity) {
2022-06-08 02:00:00 +10:00
Vec3D vec3d = entityplayer.position().subtract(this.entity.position());
2023-09-22 02:40:00 +10:00
int i = PlayerChunkMap.this.getPlayerViewDistance(entityplayer);
2021-03-16 09:00:00 +11:00
diff --git a/src/main/java/net/minecraft/server/level/WorldServer.java b/src/main/java/net/minecraft/server/level/WorldServer.java
2025-04-13 10:28:23 +10:00
index bafca6b82..f39ee0546 100644
2021-03-16 09:00:00 +11:00
--- a/src/main/java/net/minecraft/server/level/WorldServer.java
+++ b/src/main/java/net/minecraft/server/level/WorldServer.java
2025-04-13 10:28:23 +10:00
@@ -1070,6 +1070,7 @@ public class WorldServer extends World implements ServerEntityGetter, GeneratorA
2019-04-23 12:00:00 +10:00
// CraftBukkit start
2021-11-22 09:00:00 +11:00
private boolean addEntity(Entity entity, CreatureSpawnEvent.SpawnReason spawnReason) {
+ org.spigotmc.AsyncCatcher.catchOp("entity add"); // Spigot
2021-06-11 15:00:00 +10:00
if (entity.isRemoved()) {
2021-11-22 09:00:00 +11:00
// WorldServer.LOGGER.warn("Tried to add entity {} but it was marked as removed already", EntityTypes.getKey(entity.getType())); // CraftBukkit
2018-12-17 12:35:20 +11:00
return false;
2025-04-13 10:28:23 +10:00
@@ -1828,6 +1829,7 @@ public class WorldServer extends World implements ServerEntityGetter, GeneratorA
2021-06-11 15:00:00 +10:00
@Override
public LevelEntityGetter<Entity> getEntities() {
+ org.spigotmc.AsyncCatcher.catchOp("Chunk getEntities call"); // Spigot
2021-11-22 09:00:00 +11:00
return this.entityManager.getEntityGetter();
}
2025-04-13 10:28:23 +10:00
@@ -1955,6 +1957,7 @@ public class WorldServer extends World implements ServerEntityGetter, GeneratorA
2021-06-11 15:00:00 +10:00
}
2021-11-22 09:00:00 +11:00
public void onTrackingStart(Entity entity) {
2021-06-11 15:00:00 +10:00
+ org.spigotmc.AsyncCatcher.catchOp("entity register"); // Spigot
2021-11-22 09:00:00 +11:00
WorldServer.this.getChunkSource().addEntity(entity);
2024-04-24 01:15:00 +10:00
if (entity instanceof EntityPlayer entityplayer) {
WorldServer.this.players.add(entityplayer);
2025-04-13 10:28:23 +10:00
@@ -1983,6 +1986,7 @@ public class WorldServer extends World implements ServerEntityGetter, GeneratorA
2021-06-11 15:00:00 +10:00
}
2021-11-22 09:00:00 +11:00
public void onTrackingEnd(Entity entity) {
2021-06-11 15:00:00 +10:00
+ org.spigotmc.AsyncCatcher.catchOp("entity unregister"); // Spigot
2021-11-22 09:00:00 +11:00
WorldServer.this.getChunkSource().removeEntity(entity);
2024-04-24 01:15:00 +10:00
if (entity instanceof EntityPlayer entityplayer) {
WorldServer.this.players.remove(entityplayer);
2021-03-16 09:00:00 +11:00
diff --git a/src/main/java/net/minecraft/world/entity/EntityLiving.java b/src/main/java/net/minecraft/world/entity/EntityLiving.java
2025-04-13 10:28:23 +10:00
index 947f5be3d..d2d6de827 100644
2021-03-16 09:00:00 +11:00
--- a/src/main/java/net/minecraft/world/entity/EntityLiving.java
+++ b/src/main/java/net/minecraft/world/entity/EntityLiving.java
2025-03-26 03:05:00 +11:00
@@ -1164,6 +1164,7 @@ public abstract class EntityLiving extends Entity implements Attackable {
2021-03-16 09:00:00 +11:00
}
2021-06-11 15:00:00 +10:00
public boolean addEffect(MobEffect mobeffect, @Nullable Entity entity, EntityPotionEffectEvent.Cause cause) {
2021-03-16 09:00:00 +11:00
+ org.spigotmc.AsyncCatcher.catchOp("effect add"); // Spigot
if (isTickingEffects) {
effectsToProcess.add(new ProcessableEffect(mobeffect, cause));
return true;
diff --git a/src/main/java/net/minecraft/world/item/crafting/CraftingManager.java b/src/main/java/net/minecraft/world/item/crafting/CraftingManager.java
2025-03-26 03:05:00 +11:00
index a23c28736..4406c32e4 100644
2021-03-16 09:00:00 +11:00
--- a/src/main/java/net/minecraft/world/item/crafting/CraftingManager.java
+++ b/src/main/java/net/minecraft/world/item/crafting/CraftingManager.java
2025-03-26 03:05:00 +11:00
@@ -117,6 +117,7 @@ public class CraftingManager extends ResourceDataAbstract<RecipeMap> implements
2021-03-16 09:00:00 +11:00
// CraftBukkit start
2023-09-22 02:40:00 +10:00
public void addRecipe(RecipeHolder<?> irecipe) {
2021-03-16 09:00:00 +11:00
+ org.spigotmc.AsyncCatcher.catchOp("Recipe Add"); // Spigot
2024-10-23 02:15:00 +11:00
this.recipes.addRecipe(irecipe);
finalizeRecipeLoading();
}
2021-03-16 09:00:00 +11:00
diff --git a/src/main/java/net/minecraft/world/level/block/state/BlockBase.java b/src/main/java/net/minecraft/world/level/block/state/BlockBase.java
2025-03-26 03:05:00 +11:00
index 7c63efd69..61311ca82 100644
2021-03-16 09:00:00 +11:00
--- a/src/main/java/net/minecraft/world/level/block/state/BlockBase.java
+++ b/src/main/java/net/minecraft/world/level/block/state/BlockBase.java
2025-03-26 03:05:00 +11:00
@@ -162,7 +162,9 @@ public abstract class BlockBase implements FeatureElement {
2024-10-23 02:15:00 +11:00
protected void neighborChanged(IBlockData iblockdata, World world, BlockPosition blockposition, Block block, @Nullable Orientation orientation, boolean flag) {}
2021-03-16 09:00:00 +11:00
2024-04-24 01:15:00 +10:00
- protected void onPlace(IBlockData iblockdata, World world, BlockPosition blockposition, IBlockData iblockdata1, boolean flag) {}
+ protected void onPlace(IBlockData iblockdata, World world, BlockPosition blockposition, IBlockData iblockdata1, boolean flag) {
2021-03-16 09:00:00 +11:00
+ org.spigotmc.AsyncCatcher.catchOp("block onPlace"); // Spigot
+ }
2024-07-28 15:19:02 +10:00
// CraftBukkit start
protected void onPlace(IBlockData iblockdata, World world, BlockPosition blockposition, IBlockData iblockdata1, boolean flag, @Nullable ItemActionContext context) {
2018-07-18 12:36:24 +10:00
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
2025-03-26 03:05:00 +11:00
index e6e8076e1..d002ad986 100644
2018-07-18 12:36:24 +10:00
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
@@ -899,6 +899,7 @@ public final class CraftServer implements Server {
2018-07-18 12:36:24 +10:00
public boolean dispatchCommand(CommandSender sender, String commandLine) {
2023-06-12 19:41:07 +10:00
Preconditions.checkArgument(sender != null, "sender cannot be null");
Preconditions.checkArgument(commandLine != null, "commandLine cannot be null");
+ org.spigotmc.AsyncCatcher.catchOp("command dispatch"); // Spigot
2018-07-18 12:36:24 +10:00
if (commandMap.dispatch(sender, commandLine)) {
return true;
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
2025-04-13 10:28:23 +10:00
index b8f783209..33172774d 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
2025-04-13 10:28:23 +10:00
@@ -279,6 +279,7 @@ public class CraftWorld extends CraftRegionAccessor implements World {
2019-04-28 11:41:06 +10:00
@Override
2019-04-23 12:00:00 +10:00
public boolean unloadChunkRequest(int x, int z) {
+ org.spigotmc.AsyncCatcher.catchOp("chunk unload"); // Spigot
2020-06-06 19:28:03 +10:00
if (isChunkLoaded(x, z)) {
2025-03-26 03:05:00 +11:00
world.getChunkSource().removeTicketWithRadius(TicketType.PLUGIN, new ChunkCoordIntPair(x, z), 1);
2020-06-06 19:28:03 +10:00
}
2025-04-13 10:28:23 +10:00
@@ -287,6 +288,7 @@ public class CraftWorld extends CraftRegionAccessor implements World {
}
2019-04-23 12:00:00 +10:00
private boolean unloadChunk0(int x, int z, boolean save) {
+ org.spigotmc.AsyncCatcher.catchOp("chunk unload"); // Spigot
2020-06-06 19:28:03 +10:00
if (!isChunkLoaded(x, z)) {
2019-04-23 12:00:00 +10:00
return true;
2020-06-06 19:28:03 +10:00
}
2025-04-13 10:28:23 +10:00
@@ -303,6 +305,7 @@ public class CraftWorld extends CraftRegionAccessor implements World {
2019-04-28 11:41:06 +10:00
@Override
public boolean regenerateChunk(int x, int z) {
+ org.spigotmc.AsyncCatcher.catchOp("chunk regenerate"); // Spigot
2019-04-23 12:00:00 +10:00
throw new UnsupportedOperationException("Not supported in this Minecraft version! Unless you can fix it, this is not a bug :)");
/*
if (!unloadChunk0(x, z, false)) {
2025-04-13 10:28:23 +10:00
@@ -380,6 +383,7 @@ public class CraftWorld extends CraftRegionAccessor implements World {
2019-04-28 11:41:06 +10:00
@Override
public boolean loadChunk(int x, int z, boolean generate) {
+ org.spigotmc.AsyncCatcher.catchOp("chunk load"); // Spigot
2021-11-22 09:00:00 +11:00
IChunkAccess chunk = world.getChunkSource().getChunk(x, z, generate ? ChunkStatus.FULL : ChunkStatus.EMPTY, true);
2019-04-23 12:00:00 +10:00
// If generate = false, but the chunk already exists, we will get this back.
2025-04-13 10:28:23 +10:00
@@ -915,6 +919,7 @@ public class CraftWorld extends CraftRegionAccessor implements World {
@Override
2023-11-14 20:20:38 +13:00
public Collection<Entity> getNearbyEntities(BoundingBox boundingBox, Predicate<? super Entity> filter) {
+ org.spigotmc.AsyncCatcher.catchOp("getNearbyEntities"); // Spigot
2023-06-12 19:41:07 +10:00
Preconditions.checkArgument(boundingBox != null, "BoundingBox cannot be null");
AxisAlignedBB bb = new AxisAlignedBB(boundingBox.getMinX(), boundingBox.getMinY(), boundingBox.getMinZ(), boundingBox.getMaxX(), boundingBox.getMaxY(), boundingBox.getMaxZ());
2025-04-13 10:28:23 +10:00
@@ -1069,6 +1074,7 @@ public class CraftWorld extends CraftRegionAccessor implements World {
2019-08-13 20:38:28 +10:00
@Override
public void save() {
+ org.spigotmc.AsyncCatcher.catchOp("world save"); // Spigot
this.server.checkSaveState();
2021-06-11 15:00:00 +10:00
boolean oldSave = world.noSave;
2020-06-25 10:00:00 +10:00
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
2025-03-26 03:05:00 +11:00
index 19ed72385..a36d8cdb8 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
2024-10-23 02:15:00 +11:00
@@ -230,6 +230,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
@Override
public List<org.bukkit.entity.Entity> getNearbyEntities(double x, double y, double z) {
2021-08-15 08:08:25 +10:00
Preconditions.checkState(!entity.generation, "Cannot get nearby entities during world generation");
+ org.spigotmc.AsyncCatcher.catchOp("getNearbyEntities"); // Spigot
2021-08-15 08:08:25 +10:00
2023-06-08 01:30:00 +10:00
List<Entity> notchEntityList = entity.level().getEntities(entity, entity.getBoundingBox().inflate(x, y, z), Predicates.alwaysTrue());
List<org.bukkit.entity.Entity> bukkitEntityList = new java.util.ArrayList<org.bukkit.entity.Entity>(notchEntityList.size());
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
2025-04-13 10:28:23 +10:00
index a1f7c91e3..7b68caebd 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
2024-10-24 06:15:00 +11:00
@@ -496,6 +496,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
2013-12-01 14:40:53 +11:00
@Override
public void kickPlayer(String message) {
+ org.spigotmc.AsyncCatcher.catchOp("player kick"); // Spigot
2024-08-24 07:58:17 +10:00
getHandle().transferCookieConnection.kickPlayer(CraftChatMessage.fromStringOrEmpty(message, true));
}
diff --git a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboardManager.java b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboardManager.java
2025-01-25 20:00:02 +11:00
index 726887ece..ec5670e24 100644
--- a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboardManager.java
+++ b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboardManager.java
2019-04-28 11:41:06 +10:00
@@ -41,6 +41,7 @@ public final class CraftScoreboardManager implements ScoreboardManager {
2019-04-28 11:41:06 +10:00
@Override
public CraftScoreboard getNewScoreboard() {
+ org.spigotmc.AsyncCatcher.catchOp("scoreboard creation"); // Spigot
CraftScoreboard scoreboard = new CraftScoreboard(new ScoreboardServer(server));
scoreboards.add(scoreboard);
return scoreboard;
2017-06-19 19:56:13 +10:00
diff --git a/src/main/java/org/bukkit/craftbukkit/util/ServerShutdownThread.java b/src/main/java/org/bukkit/craftbukkit/util/ServerShutdownThread.java
2025-01-25 20:00:02 +11:00
index 2e057fd4c..ddef523ea 100644
2017-06-19 19:56:13 +10:00
--- a/src/main/java/org/bukkit/craftbukkit/util/ServerShutdownThread.java
+++ b/src/main/java/org/bukkit/craftbukkit/util/ServerShutdownThread.java
2019-04-23 12:00:00 +10:00
@@ -12,6 +12,7 @@ public class ServerShutdownThread extends Thread {
2017-06-19 19:56:13 +10:00
@Override
public void run() {
try {
+ org.spigotmc.AsyncCatcher.enabled = false; // Spigot
2019-04-23 12:00:00 +10:00
server.close();
} finally {
try {
diff --git a/src/main/java/org/spigotmc/AsyncCatcher.java b/src/main/java/org/spigotmc/AsyncCatcher.java
new file mode 100644
2025-01-25 20:00:02 +11:00
index 000000000..aeed76972
--- /dev/null
+++ b/src/main/java/org/spigotmc/AsyncCatcher.java
@@ -0,0 +1,17 @@
+package org.spigotmc;
+
+import net.minecraft.server.MinecraftServer;
+
+public class AsyncCatcher
+{
+
+ public static boolean enabled = true;
+
+ public static void catchOp(String reason)
+ {
2019-04-23 12:00:00 +10:00
+ if ( enabled && Thread.currentThread() != MinecraftServer.getServer().serverThread )
+ {
+ throw new IllegalStateException( "Asynchronous " + reason + "!" );
+ }
+ }
+}
--
2025-03-26 03:05:00 +11:00
2.49.0