From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: wangxyper Date: Tue, 24 Jan 2023 09:32:37 +0800 Subject: [PATCH] Hearse: Fix some threading issue in bukkit event system Original license: MIT Original project: https://github.com/Era4FunMC/Hearse diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java index 236aa2c1841eef6ca723a809b1632894bebf0b67..6065bc202d3a5d7efb32ccdd1e7a3131a1a36b4c 100644 --- a/src/main/java/org/bukkit/Server.java +++ b/src/main/java/org/bukkit/Server.java @@ -1489,6 +1489,12 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi */ boolean isPrimaryThread(); + //Hearse start + /** + * Get current thread is worker or other + */ + boolean isWorkerThread(); + // Paper start /** * Gets the message that is displayed on the server list. diff --git a/src/main/java/org/bukkit/plugin/SimplePluginManager.java b/src/main/java/org/bukkit/plugin/SimplePluginManager.java index 17b8d42f8e2897eb019ef12ad772ed0d505f7e84..df42a02c80931e234ca1ca1cfb3a2a83c1453870 100644 --- a/src/main/java/org/bukkit/plugin/SimplePluginManager.java +++ b/src/main/java/org/bukkit/plugin/SimplePluginManager.java @@ -646,8 +646,11 @@ public final class SimplePluginManager implements PluginManager { defaultPerms.get(false).clear(); } } + private void fireEvent(Event event) { callEvent(event); } // Paper - support old method incase plugin uses reflection + private final Object eventLock = new Object();//Hearse ensure event system thread safe + /** * Calls an event with the given details. * @@ -655,6 +658,20 @@ public final class SimplePluginManager implements PluginManager { */ @Override public void callEvent(@NotNull Event event) { + // Hearse start + if (server.isWorkerThread()) { + synchronized (this.eventLock) { + this.fireCallEvent(event); + } + return; + } + + this.fireCallEvent(event); + // Hearse end + } + + // Hearse start - split to a new method + private void fireCallEvent(Event event) { // Gale start - JettPack - skip events without listeners HandlerList handlers = event.getHandlers(); RegisteredListener[] listeners = handlers.getRegisteredListeners(); @@ -692,7 +709,7 @@ public final class SimplePluginManager implements PluginManager { plugin.getDescription().getAuthors(), plugin.getDescription().getFullName(), ex.getMessage() - )); + )); } } catch (Throwable ex) { gg.pufferfish.pufferfish.sentry.SentryContext.setEventContext(event, registration); // Pufferfish @@ -707,6 +724,7 @@ public final class SimplePluginManager implements PluginManager { } } } + // Hearse end @Override public void registerEvents(@NotNull Listener listener, @NotNull Plugin plugin) {