mirror of
https://github.com/Winds-Studio/Leaf.git
synced 2025-12-22 08:29:28 +00:00
80 lines
3.1 KiB
Diff
80 lines
3.1 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: wangxyper <wangxyper@163.com>
|
|
Date: Tue, 24 Jan 2023 09:32:37 +0800
|
|
Subject: [PATCH] Hearse: Fix some threading issue in bukkit event system
|
|
|
|
Original license: MIT
|
|
Original project: https://github.com/Era4FunMC/Hearse
|
|
|
|
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
|
|
index 236aa2c1841eef6ca723a809b1632894bebf0b67..6065bc202d3a5d7efb32ccdd1e7a3131a1a36b4c 100644
|
|
--- a/src/main/java/org/bukkit/Server.java
|
|
+++ b/src/main/java/org/bukkit/Server.java
|
|
@@ -1489,6 +1489,12 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
|
|
*/
|
|
boolean isPrimaryThread();
|
|
|
|
+ //Hearse start
|
|
+ /**
|
|
+ * Get current thread is worker or other
|
|
+ */
|
|
+ boolean isWorkerThread();
|
|
+
|
|
// Paper start
|
|
/**
|
|
* Gets the message that is displayed on the server list.
|
|
diff --git a/src/main/java/org/bukkit/plugin/SimplePluginManager.java b/src/main/java/org/bukkit/plugin/SimplePluginManager.java
|
|
index 17b8d42f8e2897eb019ef12ad772ed0d505f7e84..df42a02c80931e234ca1ca1cfb3a2a83c1453870 100644
|
|
--- a/src/main/java/org/bukkit/plugin/SimplePluginManager.java
|
|
+++ b/src/main/java/org/bukkit/plugin/SimplePluginManager.java
|
|
@@ -646,8 +646,11 @@ public final class SimplePluginManager implements PluginManager {
|
|
defaultPerms.get(false).clear();
|
|
}
|
|
}
|
|
+
|
|
private void fireEvent(Event event) { callEvent(event); } // Paper - support old method incase plugin uses reflection
|
|
|
|
+ private final Object eventLock = new Object();//Hearse ensure event system thread safe
|
|
+
|
|
/**
|
|
* Calls an event with the given details.
|
|
*
|
|
@@ -655,6 +658,20 @@ public final class SimplePluginManager implements PluginManager {
|
|
*/
|
|
@Override
|
|
public void callEvent(@NotNull Event event) {
|
|
+ // Hearse start
|
|
+ if (server.isWorkerThread()) {
|
|
+ synchronized (this.eventLock) {
|
|
+ this.fireCallEvent(event);
|
|
+ }
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ this.fireCallEvent(event);
|
|
+ // Hearse end
|
|
+ }
|
|
+
|
|
+ // Hearse start - split to a new method
|
|
+ private void fireCallEvent(Event event) {
|
|
// Gale start - JettPack - skip events without listeners
|
|
HandlerList handlers = event.getHandlers();
|
|
RegisteredListener[] listeners = handlers.getRegisteredListeners();
|
|
@@ -692,7 +709,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
|
|
@@ -707,6 +724,7 @@ public final class SimplePluginManager implements PluginManager {
|
|
}
|
|
}
|
|
}
|
|
+ // Hearse end
|
|
|
|
@Override
|
|
public void registerEvents(@NotNull Listener listener, @NotNull Plugin plugin) {
|