9
0
mirror of https://github.com/Winds-Studio/Leaf.git synced 2025-12-22 08:29:28 +00:00
Files
Leaf/patches/api/0011-Hearse-Fix-some-threading-issue-in-bukkit-event-syst.patch
2023-01-27 08:39:13 -05:00

80 lines
3.0 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 8eb8a788dc3dbc0d5ac24089a57c730089fd8dbe..91064280782956049f9f31fab97e567f3758e354 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 ba869354adc59db2fc547c481c1ed4d5d0af23b7..6a0a1e95b81da0087c2d56b905f1de1d0225ae5b 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.
*
@@ -666,6 +669,20 @@ public final class SimplePluginManager implements PluginManager {
}
// KTP end - optimize spigot event bus
+ //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) {
HandlerList handlers = event.getHandlers();
RegisteredListener[] listeners = handlers.getRegisteredListeners();
@@ -687,7 +704,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
@@ -702,6 +719,7 @@ public final class SimplePluginManager implements PluginManager {
}
}
}
+ //Hearse end
@Override
public void registerEvents(@NotNull Listener listener, @NotNull Plugin plugin) {