summaryrefslogtreecommitdiffstats
path: root/src/main/java/org/bukkit/plugin/SimplePluginManager.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/org/bukkit/plugin/SimplePluginManager.java')
-rw-r--r--src/main/java/org/bukkit/plugin/SimplePluginManager.java21
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();