From cca2920506a5e3b8460d12e89e60788bd5da251e Mon Sep 17 00:00:00 2001 From: md_5 Date: Sat, 23 Mar 2013 18:05:22 +1100 Subject: [PATCH] Move async checks to their own patch so we can add more of them. --- CraftBukkit-Patches/0002-Spigot-Changes.patch | 29 +--- ...ch => 0005-Async-Operation-Catching.patch} | 23 ++- .../0027-Watchdog-Thread.patch | 138 +++++++++++++++--- ...ion-itself-instead-of-next-to-bed-Fi.patch | 6 +- .../0040-Entity-Tracking-Ranges.patch | 6 +- .../0042-BungeeCord-Support.patch | 6 +- .../0043-Texture-Pack-Resolutions.patch | 8 +- 7 files changed, 154 insertions(+), 62 deletions(-) rename CraftBukkit-Patches/{0005-Thread-safety.-Adds-thread-safety-for-chunk-load-unl.patch => 0005-Async-Operation-Catching.patch} (57%) diff --git a/CraftBukkit-Patches/0002-Spigot-Changes.patch b/CraftBukkit-Patches/0002-Spigot-Changes.patch index ce2d45e2bb..b39da05767 100644 --- a/CraftBukkit-Patches/0002-Spigot-Changes.patch +++ b/CraftBukkit-Patches/0002-Spigot-Changes.patch @@ -1,6 +1,6 @@ -From 05108bcbeddcf5681feb3d5f7c986ce738cccbb8 Mon Sep 17 00:00:00 2001 +From 308eaa2dbd96b59ee9bdc253390679070bfd1533 Mon Sep 17 00:00:00 2001 From: md_5 -Date: Sat, 23 Mar 2013 09:39:40 +1100 +Date: Sat, 23 Mar 2013 17:57:27 +1100 Subject: [PATCH] Spigot Changes The set of changes which provide core Spigot functionality, which would otherwise be a mess to try and apply individually. @@ -28,9 +28,8 @@ The set of changes which provide core Spigot functionality, which would otherwis .../java/org/bukkit/craftbukkit/CraftWorld.java | 68 ++++++++++++- src/main/java/org/bukkit/craftbukkit/Spigot.java | 20 ++++ .../craftbukkit/chunkio/ChunkIOProvider.java | 2 +- - .../org/bukkit/craftbukkit/entity/CraftPlayer.java | 7 ++ src/main/resources/configurations/bukkit.yml | 25 +++++ - 25 files changed, 392 insertions(+), 78 deletions(-) + 24 files changed, 385 insertions(+), 78 deletions(-) create mode 100644 src/main/java/org/bukkit/craftbukkit/Spigot.java diff --git a/.gitignore b/.gitignore @@ -978,28 +977,6 @@ index 48cf5ba..1d4764c 100644 return; } -diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 70111e7..1871d3e 100644 ---- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -213,10 +213,17 @@ public class CraftPlayer extends CraftHumanEntity implements Player { - } - - public void kickPlayer(String message) { -+ // Spigot start -+ kickPlayer(message, false); -+ } -+ -+ public void kickPlayer(String message, boolean async){ - if (getHandle().playerConnection == null) return; -+ if (!async && !Bukkit.isPrimaryThread()) throw new IllegalStateException("Cannot kick player from asynchronous thread!"); // Spigot - - getHandle().playerConnection.disconnect(message == null ? "" : message); - } -+ // Spigot end - - public void setCompassTarget(Location loc) { - if (getHandle().playerConnection == null) return; diff --git a/src/main/resources/configurations/bukkit.yml b/src/main/resources/configurations/bukkit.yml index 61a95e3..58501ea 100644 --- a/src/main/resources/configurations/bukkit.yml diff --git a/CraftBukkit-Patches/0005-Thread-safety.-Adds-thread-safety-for-chunk-load-unl.patch b/CraftBukkit-Patches/0005-Async-Operation-Catching.patch similarity index 57% rename from CraftBukkit-Patches/0005-Thread-safety.-Adds-thread-safety-for-chunk-load-unl.patch rename to CraftBukkit-Patches/0005-Async-Operation-Catching.patch index dc43819855..8355dba540 100644 --- a/CraftBukkit-Patches/0005-Thread-safety.-Adds-thread-safety-for-chunk-load-unl.patch +++ b/CraftBukkit-Patches/0005-Async-Operation-Catching.patch @@ -1,12 +1,13 @@ -From 60bfde2f20cab9fade83e6f34af2a2ee5ed168c9 Mon Sep 17 00:00:00 2001 +From 67cddbc9856c267a110cf7531b8fde518e327613 Mon Sep 17 00:00:00 2001 From: md_5 Date: Thu, 7 Mar 2013 20:12:46 +1100 -Subject: [PATCH] Thread safety. Adds thread safety for chunk load / unload - methods. +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. --- - src/main/java/org/bukkit/craftbukkit/CraftWorld.java | 3 +++ - 1 file changed, 3 insertions(+) + src/main/java/org/bukkit/craftbukkit/CraftWorld.java | 3 +++ + src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java | 1 + + 2 files changed, 4 insertions(+) diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java index 9343d46..b569dc4 100644 @@ -36,6 +37,18 @@ index 9343d46..b569dc4 100644 chunkLoadCount++; if (generate) { // Use the default variant of loadChunk when generate == true. +diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +index 70111e7..59e63ef 100644 +--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java ++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +@@ -213,6 +213,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { + } + + public void kickPlayer(String message) { ++ if (Thread.currentThread() != MinecraftServer.getServer().primaryThread) throw new IllegalStateException("Asynchronous player kick!"); + if (getHandle().playerConnection == null) return; + + getHandle().playerConnection.disconnect(message == null ? "" : message); -- 1.8.1-rc2 diff --git a/CraftBukkit-Patches/0027-Watchdog-Thread.patch b/CraftBukkit-Patches/0027-Watchdog-Thread.patch index 5c6afb6fff..1d4911f83f 100644 --- a/CraftBukkit-Patches/0027-Watchdog-Thread.patch +++ b/CraftBukkit-Patches/0027-Watchdog-Thread.patch @@ -1,15 +1,15 @@ -From 63bf5cad042a511332edc488e25b53df78c64919 Mon Sep 17 00:00:00 2001 +From 82330dae19c04ca1d92033b449536f4f79d1e322 Mon Sep 17 00:00:00 2001 From: md_5 Date: Sat, 23 Feb 2013 12:33:20 +1100 Subject: [PATCH] Watchdog Thread. --- - .../java/net/minecraft/server/MinecraftServer.java | 2 + - src/main/java/org/bukkit/craftbukkit/Spigot.java | 78 +++++++++++++++++- - src/main/java/org/spigotmc/RestartCommand.java | 23 ++++++ - src/main/java/org/spigotmc/WatchdogThread.java | 93 ++++++++++++++++++++++ - src/main/resources/configurations/bukkit.yml | 3 + - 5 files changed, 197 insertions(+), 2 deletions(-) + .../java/net/minecraft/server/MinecraftServer.java | 2 + + src/main/java/org/bukkit/craftbukkit/Spigot.java | 123 +++++++++++++++++---- + src/main/java/org/spigotmc/RestartCommand.java | 23 ++++ + src/main/java/org/spigotmc/WatchdogThread.java | 93 ++++++++++++++++ + src/main/resources/configurations/bukkit.yml | 3 + + 5 files changed, 222 insertions(+), 22 deletions(-) create mode 100644 src/main/java/org/spigotmc/RestartCommand.java create mode 100644 src/main/java/org/spigotmc/WatchdogThread.java @@ -34,7 +34,7 @@ index 28135f4..3689a3d 100644 this.isStopped = true; } catch (Throwable throwable1) { diff --git a/src/main/java/org/bukkit/craftbukkit/Spigot.java b/src/main/java/org/bukkit/craftbukkit/Spigot.java -index b00c885..dcfac79 100644 +index b00c885..d445c2e 100644 --- a/src/main/java/org/bukkit/craftbukkit/Spigot.java +++ b/src/main/java/org/bukkit/craftbukkit/Spigot.java @@ -1,5 +1,6 @@ @@ -44,20 +44,29 @@ index b00c885..dcfac79 100644 import java.io.IOException; import java.util.ArrayList; import net.minecraft.server.*; -@@ -8,9 +9,11 @@ import org.bukkit.configuration.file.YamlConfiguration; +@@ -8,21 +9,24 @@ import org.bukkit.configuration.file.YamlConfiguration; import java.util.List; import java.util.logging.Level; -import java.util.logging.Logger; ++import net.minecraft.server.EntityPlayer; import org.bukkit.Bukkit; -+import org.bukkit.entity.Player; import org.spigotmc.Metrics; +import org.spigotmc.RestartCommand; +import org.spigotmc.WatchdogThread; public class Spigot { - static AxisAlignedBB maxBB = AxisAlignedBB.a(0,0,0,0,0,0); -@@ -23,6 +26,7 @@ public class Spigot { +- static AxisAlignedBB maxBB = AxisAlignedBB.a(0,0,0,0,0,0); +- static AxisAlignedBB miscBB = AxisAlignedBB.a(0,0,0,0,0,0); +- static AxisAlignedBB animalBB = AxisAlignedBB.a(0,0,0,0,0,0); +- static AxisAlignedBB monsterBB = AxisAlignedBB.a(0,0,0,0,0,0); + ++ static AxisAlignedBB maxBB = AxisAlignedBB.a(0, 0, 0, 0, 0, 0); ++ static AxisAlignedBB miscBB = AxisAlignedBB.a(0, 0, 0, 0, 0, 0); ++ static AxisAlignedBB animalBB = AxisAlignedBB.a(0, 0, 0, 0, 0, 0); ++ static AxisAlignedBB monsterBB = AxisAlignedBB.a(0, 0, 0, 0, 0, 0); + public static boolean tabPing = false; + private static Metrics metrics; public static void initialize(CraftServer server, SimpleCommandMap commandMap, YamlConfiguration configuration) { commandMap.register("bukkit", new org.bukkit.craftbukkit.command.TicksPerSecondCommand("tps")); @@ -91,7 +100,100 @@ index b00c885..dcfac79 100644 } if (server.chunkGCPeriod == 0) { -@@ -265,4 +280,63 @@ public class Spigot { +@@ -59,6 +74,7 @@ public class Spigot { + /** + * Initializes an entities type on construction to specify what group this + * entity is in for activation ranges. ++ * + * @param entity + * @return group id + */ +@@ -80,21 +96,20 @@ public class Spigot { + * @return boolean If it should always tick. + */ + public static boolean initializeEntityActivationState(Entity entity, CraftWorld world) { +- if ( (entity.activationType == 3 && world.miscEntityActivationRange == 0) +- || (entity.activationType == 2 && world.animalEntityActivationRange == 0) +- || (entity.activationType == 1 && world.monsterEntityActivationRange == 0) +- || entity instanceof EntityHuman +- || entity instanceof EntityItemFrame +- || entity instanceof EntityProjectile +- || entity instanceof EntityEnderDragon +- || entity instanceof EntityComplexPart +- || entity instanceof EntityWither +- || entity instanceof EntityFireball +- || entity instanceof EntityWeather +- || entity instanceof EntityTNTPrimed +- || entity instanceof EntityEnderCrystal +- || entity instanceof EntityFireworks +- ) { ++ if ((entity.activationType == 3 && world.miscEntityActivationRange == 0) ++ || (entity.activationType == 2 && world.animalEntityActivationRange == 0) ++ || (entity.activationType == 1 && world.monsterEntityActivationRange == 0) ++ || entity instanceof EntityHuman ++ || entity instanceof EntityItemFrame ++ || entity instanceof EntityProjectile ++ || entity instanceof EntityEnderDragon ++ || entity instanceof EntityComplexPart ++ || entity instanceof EntityWither ++ || entity instanceof EntityFireball ++ || entity instanceof EntityWeather ++ || entity instanceof EntityTNTPrimed ++ || entity instanceof EntityEnderCrystal ++ || entity instanceof EntityFireworks) { + return true; + } + +@@ -104,6 +119,7 @@ public class Spigot { + /** + * Utility method to grow an AABB without creating a new AABB or touching + * the pool, so we can re-use ones we have. ++ * + * @param target + * @param source + * @param x +@@ -122,6 +138,7 @@ public class Spigot { + /** + * Find what entities are in range of the players in the world and set + * active if in range. ++ * + * @param world + */ + public static void activateEntities(World world) { +@@ -160,6 +177,7 @@ public class Spigot { + + /** + * Checks for the activation state of all entities in this chunk. ++ * + * @param chunk + */ + private static void activateChunkEntities(Chunk chunk) { +@@ -195,6 +213,7 @@ public class Spigot { + /** + * If an entity is not in range, do some more checks to see if we should + * give it a shot. ++ * + * @param entity + * @return + */ +@@ -205,7 +224,7 @@ public class Spigot { + } + if (!(entity instanceof EntityArrow)) { + if (!entity.onGround || entity.passenger != null +- || entity.vehicle != null) { ++ || entity.vehicle != null) { + return true; + } + } else if (!((EntityArrow) entity).inGround) { +@@ -235,6 +254,7 @@ public class Spigot { + + /** + * Checks if the entity is active for this tick. ++ * + * @param entity + * @return + */ +@@ -265,4 +285,63 @@ public class Spigot { SpigotTimings.checkIfActiveTimer.stopTiming(); return isActive; } @@ -104,8 +206,8 @@ index b00c885..dcfac79 100644 + System.out.println("Attempting to restart with " + startupScript); + + // Kick all players -+ for (Player p : Bukkit.getServer().getOnlinePlayers()) { -+ ((org.bukkit.craftbukkit.entity.CraftPlayer) p).kickPlayer("Server is restarting", true); ++ for (EntityPlayer p : (List< EntityPlayer>) MinecraftServer.getServer().getPlayerList().players) { ++ p.playerConnection.disconnect("Server is restarting"); + } + // Give the socket a chance to send the packets + try { @@ -130,15 +232,15 @@ index b00c885..dcfac79 100644 + // This will be done AFTER the server has completely halted + Thread shutdownHook = new Thread() { + @Override -+ public void run(){ ++ public void run() { + try { + String os = System.getProperty("os.name").toLowerCase(); + if (os.contains("win")) { + Runtime.getRuntime().exec("cmd /c start " + file.getPath()); + } else { -+ Runtime.getRuntime().exec(new String[] { "sh", file.getPath()}); ++ Runtime.getRuntime().exec(new String[]{"sh", file.getPath()}); + } -+ } catch (Exception e){ ++ } catch (Exception e) { + e.printStackTrace(); + } + } diff --git a/CraftBukkit-Patches/0030-Return-bed-location-itself-instead-of-next-to-bed-Fi.patch b/CraftBukkit-Patches/0030-Return-bed-location-itself-instead-of-next-to-bed-Fi.patch index 193347b173..11d7447b12 100644 --- a/CraftBukkit-Patches/0030-Return-bed-location-itself-instead-of-next-to-bed-Fi.patch +++ b/CraftBukkit-Patches/0030-Return-bed-location-itself-instead-of-next-to-bed-Fi.patch @@ -1,4 +1,4 @@ -From 38f144fcd9d44015bb3db3530742c12708b49dfe Mon Sep 17 00:00:00 2001 +From f9ec6953de1d80b95eea4b195973b9dda36f5e0f Mon Sep 17 00:00:00 2001 From: EdGruberman Date: Fri, 22 Feb 2013 09:23:51 -0700 Subject: [PATCH] Return bed location itself instead of next to bed; Fixes @@ -9,10 +9,10 @@ Subject: [PATCH] Return bed location itself instead of next to bed; Fixes 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 1871d3e..2e58bf0 100644 +index 59e63ef..3c34a4c 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -632,10 +632,28 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -626,10 +626,28 @@ public class CraftPlayer extends CraftHumanEntity implements Player { ChunkCoordinates bed = getHandle().getBed(); if (world != null && bed != null) { diff --git a/CraftBukkit-Patches/0040-Entity-Tracking-Ranges.patch b/CraftBukkit-Patches/0040-Entity-Tracking-Ranges.patch index 55dea1e221..5ac2a54041 100644 --- a/CraftBukkit-Patches/0040-Entity-Tracking-Ranges.patch +++ b/CraftBukkit-Patches/0040-Entity-Tracking-Ranges.patch @@ -1,4 +1,4 @@ -From 9e7503dbe6691e74f3ef4d864b459da13597cb29 Mon Sep 17 00:00:00 2001 +From bc6b6883004dfcf9bae2842933ae9603f720412b Mon Sep 17 00:00:00 2001 From: Aikar Date: Wed, 20 Feb 2013 11:58:47 -0500 Subject: [PATCH] Entity Tracking Ranges @@ -83,10 +83,10 @@ index 3bfc669..804da57 100644 public Block getBlockAt(int x, int y, int z) { diff --git a/src/main/java/org/bukkit/craftbukkit/Spigot.java b/src/main/java/org/bukkit/craftbukkit/Spigot.java -index dcfac79..beab433 100644 +index d445c2e..3bfd29b 100644 --- a/src/main/java/org/bukkit/craftbukkit/Spigot.java +++ b/src/main/java/org/bukkit/craftbukkit/Spigot.java -@@ -339,4 +339,30 @@ public class Spigot { +@@ -344,4 +344,30 @@ public class Spigot { ex.printStackTrace(); } } diff --git a/CraftBukkit-Patches/0042-BungeeCord-Support.patch b/CraftBukkit-Patches/0042-BungeeCord-Support.patch index ea33e6ff52..78b4af766c 100644 --- a/CraftBukkit-Patches/0042-BungeeCord-Support.patch +++ b/CraftBukkit-Patches/0042-BungeeCord-Support.patch @@ -1,4 +1,4 @@ -From 2e0bd90323900b7b0e85d8b8fdefac11564a6aa7 Mon Sep 17 00:00:00 2001 +From f081be9a6ac0b77c3776bfb3c058a65db932e80f Mon Sep 17 00:00:00 2001 From: md_5 Date: Sat, 23 Mar 2013 11:15:11 +1100 Subject: [PATCH] BungeeCord Support @@ -33,11 +33,11 @@ index 58687ed..ae73a43 100644 + // Spigot end } diff --git a/src/main/java/org/bukkit/craftbukkit/Spigot.java b/src/main/java/org/bukkit/craftbukkit/Spigot.java -index beab433..9a01674 100644 +index 3bfd29b..bce217e 100644 --- a/src/main/java/org/bukkit/craftbukkit/Spigot.java +++ b/src/main/java/org/bukkit/craftbukkit/Spigot.java @@ -23,6 +23,7 @@ public class Spigot { - + static AxisAlignedBB monsterBB = AxisAlignedBB.a(0, 0, 0, 0, 0, 0); public static boolean tabPing = false; private static Metrics metrics; + public static List bungeeIPs; diff --git a/CraftBukkit-Patches/0043-Texture-Pack-Resolutions.patch b/CraftBukkit-Patches/0043-Texture-Pack-Resolutions.patch index e1dd3b5ec8..bbf54702ad 100644 --- a/CraftBukkit-Patches/0043-Texture-Pack-Resolutions.patch +++ b/CraftBukkit-Patches/0043-Texture-Pack-Resolutions.patch @@ -1,4 +1,4 @@ -From d8572c7da59ef43d0adf53e4dff7400b00bb9e12 Mon Sep 17 00:00:00 2001 +From 4a8f60ad4f5babc013cd49f510bea117f9356cc3 Mon Sep 17 00:00:00 2001 From: md_5 Date: Sat, 23 Mar 2013 13:04:45 +1100 Subject: [PATCH] Texture Pack Resolutions @@ -25,7 +25,7 @@ index 3689a3d..9a78084 100644 public abstract boolean T(); diff --git a/src/main/java/org/bukkit/craftbukkit/Spigot.java b/src/main/java/org/bukkit/craftbukkit/Spigot.java -index 9a01674..cf17b5a 100644 +index bce217e..8fd635f 100644 --- a/src/main/java/org/bukkit/craftbukkit/Spigot.java +++ b/src/main/java/org/bukkit/craftbukkit/Spigot.java @@ -24,6 +24,7 @@ public class Spigot { @@ -45,10 +45,10 @@ index 9a01674..cf17b5a 100644 if (metrics == null) { try { diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 2e58bf0..d7a3bc7 100644 +index 3c34a4c..8361614 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -834,7 +834,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -828,7 +828,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { public void setTexturePack(String url) { Validate.notNull(url, "Texture pack URL cannot be null");