Support asynchronous events; Addresses BUKKIT-1212

By: Wesley Wolfe <weswolf@aol.com>
This commit is contained in:
Bukkit/Spigot
2012-06-13 21:28:13 -05:00
parent ca71171e8c
commit ad7045596d
10 changed files with 300 additions and 27 deletions

View File

@@ -92,8 +92,11 @@ public interface PluginManager {
* Calls an event with the given details
*
* @param event Event details
* @throws IllegalStateException Thrown when an asynchronous event is fired from synchronous code.<br>
* <i>Note: This is best-effort basis, and should not be used to test synchronized state. This
* is an indicator for flawed flow logic.</i>
*/
public void callEvent(Event event);
public void callEvent(Event event) throws IllegalStateException;
/**
* Registers all the events in the given listener class

View File

@@ -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();

View File

@@ -18,7 +18,12 @@ public class TimedRegisteredListener extends RegisteredListener {
super(pluginListener, eventExecutor, eventPriority, registeredPlugin, listenCancelled);
}
@Override
public void callEvent(Event event) throws EventException {
if (event.isAsynchronous()) {
super.callEvent(event);
return;
}
count++;
if (this.event == null) {
this.event = event;