From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: wangxyper Date: Sat, 28 Jan 2023 13:05:13 +0800 Subject: [PATCH] MikuServer: Fix threading issue in event system Original license: MIT Original project: https://github.com/MikuMC/MikuServer diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java index 8eb8a788dc3dbc0d5ac24089a57c730089fd8dbe..b4c6a3d57ea21aa9ebc05f6aaf6a1b750b04545c 100644 --- a/src/main/java/org/bukkit/Server.java +++ b/src/main/java/org/bukkit/Server.java @@ -113,6 +113,8 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi @NotNull public String getBukkitVersion(); + public boolean isCurrentThreadWorker(); + // Paper start - expose game version /** * Gets the version of game this server implements diff --git a/src/main/java/org/bukkit/plugin/SimplePluginManager.java b/src/main/java/org/bukkit/plugin/SimplePluginManager.java index ba869354adc59db2fc547c481c1ed4d5d0af23b7..d7064142c0aafbe17af263c4ecad6f1e879bb9d7 100644 --- a/src/main/java/org/bukkit/plugin/SimplePluginManager.java +++ b/src/main/java/org/bukkit/plugin/SimplePluginManager.java @@ -648,6 +648,8 @@ public final class SimplePluginManager implements PluginManager { } private void fireEvent(Event event) { callEvent(event); } // Paper - support old method incase plugin uses reflection + private final Object eventLock = new Object(); + /** * Calls an event with the given details. * @@ -666,6 +668,17 @@ public final class SimplePluginManager implements PluginManager { } // KTP end - optimize spigot event bus + if (server.isCurrentThreadWorker()) { + synchronized (this.eventLock) { + this.callEventInternal(event); + return; + } + } + + this.callEventInternal(event); + } + + private void callEventInternal(Event event) { HandlerList handlers = event.getHandlers(); RegisteredListener[] listeners = handlers.getRegisteredListeners(); @@ -687,7 +700,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