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

217 lines
11 KiB
Diff
Raw Normal View History

2019-05-12 11:18:39 +10:00
From 885ce5e8c2b71e8b415c851c0be3ae127962a8fc 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.
2013-08-03 19:09:09 +10:00
diff --git a/src/main/java/net/minecraft/server/Block.java b/src/main/java/net/minecraft/server/Block.java
2019-04-25 12:00:00 +10:00
index 5054b8c8a..8b91e27c6 100644
2013-08-03 19:09:09 +10:00
--- a/src/main/java/net/minecraft/server/Block.java
+++ b/src/main/java/net/minecraft/server/Block.java
2019-04-23 12:00:00 +10:00
@@ -369,10 +369,13 @@ public class Block implements IMaterial {
2013-08-03 19:09:09 +10:00
}
2018-07-15 10:00:00 +10:00
@Deprecated
2019-04-23 12:00:00 +10:00
- public void onPlace(IBlockData iblockdata, World world, BlockPosition blockposition, IBlockData iblockdata1, boolean flag) {}
+ public void onPlace(IBlockData iblockdata, World world, BlockPosition blockposition, IBlockData iblockdata1, boolean flag) {
+ org.spigotmc.AsyncCatcher.catchOp( "block onPlace"); // Spigot
2013-08-03 19:09:09 +10:00
+ }
2018-07-15 10:00:00 +10:00
@Deprecated
2019-04-23 12:00:00 +10:00
public void remove(IBlockData iblockdata, World world, BlockPosition blockposition, IBlockData iblockdata1, boolean flag) {
+ org.spigotmc.AsyncCatcher.catchOp( "block remove"); // Spigot
2019-04-23 12:00:00 +10:00
if (this.isTileEntity() && iblockdata.getBlock() != iblockdata1.getBlock()) {
world.removeTileEntity(blockposition);
}
2019-01-07 10:30:38 +11:00
diff --git a/src/main/java/net/minecraft/server/CraftingManager.java b/src/main/java/net/minecraft/server/CraftingManager.java
2019-04-25 12:00:00 +10:00
index 15dbaeb19..0086d3fd8 100644
2019-01-07 10:30:38 +11:00
--- a/src/main/java/net/minecraft/server/CraftingManager.java
+++ b/src/main/java/net/minecraft/server/CraftingManager.java
2019-04-23 12:00:00 +10:00
@@ -88,6 +88,7 @@ public class CraftingManager implements IResourcePackListener {
2019-01-07 10:30:38 +11:00
}
2019-04-23 12:00:00 +10:00
public void addRecipe(IRecipe<?> irecipe) {
2019-01-07 10:30:38 +11:00
+ org.spigotmc.AsyncCatcher.catchOp("Recipe Add"); // Spigot
2019-04-23 12:00:00 +10:00
it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap<MinecraftKey, IRecipe<?>> map = this.recipes.get(irecipe.g()); // CraftBukkit
if (map.containsKey(irecipe.getKey())) {
diff --git a/src/main/java/net/minecraft/server/EntityLiving.java b/src/main/java/net/minecraft/server/EntityLiving.java
2019-04-25 12:00:00 +10:00
index 7dfbe45d5..31abdec9c 100644
--- a/src/main/java/net/minecraft/server/EntityLiving.java
+++ b/src/main/java/net/minecraft/server/EntityLiving.java
2019-04-23 12:00:00 +10:00
@@ -815,6 +815,7 @@ public abstract class EntityLiving extends Entity {
}
2018-07-20 16:13:18 +10:00
public boolean addEffect(MobEffect mobeffect, EntityPotionEffectEvent.Cause cause) {
+ org.spigotmc.AsyncCatcher.catchOp( "effect add"); // Spigot
2015-02-12 14:25:18 +00:00
if (isTickingEffects) {
2018-07-20 16:13:18 +10:00
effectsToProcess.add(new ProcessableEffect(mobeffect, cause));
return true;
2019-04-23 12:00:00 +10:00
diff --git a/src/main/java/net/minecraft/server/PlayerChunkMap.java b/src/main/java/net/minecraft/server/PlayerChunkMap.java
2019-04-27 10:30:04 +10:00
index f552bbd3d..aa263166d 100644
2019-04-23 12:00:00 +10:00
--- a/src/main/java/net/minecraft/server/PlayerChunkMap.java
+++ b/src/main/java/net/minecraft/server/PlayerChunkMap.java
2019-04-27 10:30:04 +10:00
@@ -794,6 +794,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
}
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)) {
if (!(entity instanceof EntityLightning)) {
EntityTypes<?> entitytypes = entity.getEntityType();
2019-04-27 10:30:04 +10:00
@@ -828,6 +829,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
}
2019-04-23 12:00:00 +10:00
protected void removeEntity(Entity entity) {
+ org.spigotmc.AsyncCatcher.catchOp( "entity untrack"); // Spigot
if (entity instanceof EntityPlayer) {
EntityPlayer entityplayer = (EntityPlayer) entity;
2019-04-27 10:30:04 +10:00
@@ -1015,6 +1017,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
2019-04-23 12:00:00 +10:00
}
2019-04-23 12:00:00 +10:00
public void clear(EntityPlayer entityplayer) {
+ org.spigotmc.AsyncCatcher.catchOp( "player tracker clear"); // Spigot
if (this.trackedPlayers.remove(entityplayer)) {
this.trackerEntry.a(entityplayer);
}
2019-04-27 10:30:04 +10:00
@@ -1022,6 +1025,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
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
if (entityplayer != this.tracker) {
Vec3D vec3d = (new Vec3D(entityplayer.locX, entityplayer.locY, entityplayer.locZ)).d(this.trackerEntry.b());
int i = Math.min(this.trackingDistance, (PlayerChunkMap.this.A - 1) * 16);
diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java
2019-05-12 11:18:39 +10:00
index 41c0428c9..2affddbe0 100644
2019-04-23 12:00:00 +10:00
--- a/src/main/java/net/minecraft/server/WorldServer.java
+++ b/src/main/java/net/minecraft/server/WorldServer.java
2019-05-12 11:18:39 +10:00
@@ -902,6 +902,7 @@ public class WorldServer extends World {
2019-04-23 12:00:00 +10:00
// CraftBukkit start
private boolean addEntity0(Entity entity, CreatureSpawnEvent.SpawnReason spawnReason) {
+ org.spigotmc.AsyncCatcher.catchOp( "entity add"); // Spigot
2019-04-23 12:00:00 +10:00
if (entity.dead) {
2019-04-25 12:00:00 +10:00
// WorldServer.LOGGER.warn("Tried to add entity {} but it was marked as removed already", EntityTypes.getName(entity.getEntityType())); // CraftBukkit
2018-12-17 12:35:20 +11:00
return false;
2019-05-12 11:18:39 +10:00
@@ -1024,6 +1025,7 @@ public class WorldServer extends World {
}
public void removeEntity(Entity entity) {
+ org.spigotmc.AsyncCatcher.catchOp( "entity remove"); // Spigot
2019-04-23 12:00:00 +10:00
if (this.tickingEntities) {
throw new IllegalStateException("Removing entity while ticking!");
} else {
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
2019-05-12 11:18:39 +10:00
index f8e0d99f9..1855d921f 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
2019-04-24 10:12:26 +10:00
@@ -682,6 +682,7 @@ public final class CraftServer implements Server {
2018-07-18 12:36:24 +10:00
public boolean dispatchCommand(CommandSender sender, String commandLine) {
Validate.notNull(sender, "Sender cannot be null");
Validate.notNull(commandLine, "CommandLine cannot be null");
+ org.spigotmc.AsyncCatcher.catchOp( "command dispatch" ); // Spigot
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
2019-05-12 11:18:39 +10:00
index 72a31e205..bcea198c7 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
2019-04-30 21:46:22 +10:00
@@ -371,6 +371,7 @@ public class CraftWorld 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
2019-04-23 12:00:00 +10:00
net.minecraft.server.IChunkAccess chunk = world.getChunkProvider().getChunkAt(x, z, ChunkStatus.FULL, false);
if (chunk != null) {
world.getChunkProvider().removeTicket(TicketType.PLUGIN, chunk.getPos(), 1, Unit.INSTANCE);
2019-04-30 21:46:22 +10:00
@@ -380,6 +381,7 @@ public class CraftWorld 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
2019-04-23 12:00:00 +10:00
net.minecraft.server.Chunk chunk = (net.minecraft.server.Chunk) world.getChunkProvider().getChunkAt(x, z, ChunkStatus.FULL, false);
if (chunk == null) {
return true;
2019-04-30 21:46:22 +10:00
@@ -394,6 +396,7 @@ public class CraftWorld 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)) {
2019-04-30 21:46:22 +10:00
@@ -445,6 +448,7 @@ public class CraftWorld 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
2019-04-23 12:00:00 +10:00
IChunkAccess chunk = world.getChunkProvider().getChunkAt(x, z, generate ? ChunkStatus.FULL : ChunkStatus.EMPTY, true);
// If generate = false, but the chunk already exists, we will get this back.
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
2019-05-12 11:18:39 +10:00
index 5d7d7d6cf..bad4a8c39 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
2019-04-28 11:41:06 +10:00
@@ -297,6 +297,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
if (getHandle().playerConnection == null) return;
getHandle().playerConnection.disconnect(message == null ? "" : message);
diff --git 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
index fd9949e1e..3ecc579aa 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
2019-04-25 12:00:00 +10: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
2019-04-25 12:00:00 +10: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 + "!" );
+ }
+ }
+}
--
2019-04-23 09:33:25 +10:00
2.20.1