diff options
Diffstat (limited to 'src/main/java/org/bukkit/plugin/SimplePluginManager.java')
-rw-r--r-- | src/main/java/org/bukkit/plugin/SimplePluginManager.java | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/src/main/java/org/bukkit/plugin/SimplePluginManager.java b/src/main/java/org/bukkit/plugin/SimplePluginManager.java index e017ffdf..ca780fca 100644 --- a/src/main/java/org/bukkit/plugin/SimplePluginManager.java +++ b/src/main/java/org/bukkit/plugin/SimplePluginManager.java @@ -443,11 +443,28 @@ public final class SimplePluginManager implements PluginManager { } /** - * Calls an event with the given details + * Calls an event with the given details.<br> + * This method only synchronizes when the event is not asynchronous. * * @param event Event details */ - public synchronized void callEvent(Event event) { + public void callEvent(Event event) { + if (event.isAsynchronous()) { + if (Thread.holdsLock(this)) { + throw new IllegalStateException(event.getEventName() + " cannot be triggered asynchronously from inside synchronized code."); + } + if (server.isPrimaryThread()) { + throw new IllegalStateException(event.getEventName() + " cannot be triggered asynchronously from primary server thread."); + } + fireEvent(event); + } else { + synchronized (this) { + fireEvent(event); + } + } + } + + private void fireEvent(Event event) { HandlerList handlers = event.getHandlers(); RegisteredListener[] listeners = handlers.getRegisteredListeners(); |