mirror of
https://github.com/PaperMC/Paper.git
synced 2025-08-11 18:22:08 -07:00
Support asynchronous events; Addresses BUKKIT-1212
By: Wesley Wolfe <weswolf@aol.com>
This commit is contained in:
@@ -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
|
||||
|
@@ -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();
|
||||
|
||||
|
@@ -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;
|
||||
|
Reference in New Issue
Block a user