diff --git a/sources/src/main/java/co/aikar/timings/TimingHandler.java b/sources/src/main/java/co/aikar/timings/TimingHandler.java
index f62c56015..f51b4eeb2 100644
--- a/sources/src/main/java/co/aikar/timings/TimingHandler.java
+++ b/sources/src/main/java/co/aikar/timings/TimingHandler.java
@@ -24,8 +24,6 @@
package co.aikar.timings;
import co.aikar.util.LoadingIntMap;
-import io.akarin.api.Akari;
-import io.akarin.server.core.AkarinGlobalConfig;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import org.bukkit.Bukkit;
@@ -35,8 +33,6 @@ import java.util.logging.Level;
* Akarin Changes Note
*
* 1) Add volatile to fields
- * 2) Capable to silent async timing error
- * 3) Better handle sync stop by avoid double thread checking
* @author cakoyo
*/
class TimingHandler implements Timing {
@@ -103,7 +99,7 @@ class TimingHandler implements Timing {
@Override
public void stopTimingIfSync() {
if (Bukkit.isPrimaryThread()) {
- stopTiming(true); // Akarin - avoid twice thread check
+ stopTiming();
}
}
@@ -119,27 +115,13 @@ class TimingHandler implements Timing {
@Override
public void stopTiming() {
- // Akarin start - avoid twice thread check
- stopTiming(false);
- }
-
- public void stopTiming(boolean sync) {
if (enabled && --timingDepth == 0 && start != 0) {
- // Akarin start - silent async timing
- if (Akari.silentTiming) { // It must be off-main thread now
+ if (!Bukkit.isPrimaryThread()) {
+ Bukkit.getLogger().log(Level.SEVERE, "stopTiming called async for " + name);
+ new Throwable().printStackTrace();
start = 0;
return;
- } else {
- if (!sync && !Bukkit.isPrimaryThread()) {
- if (AkarinGlobalConfig.silentAsyncTimings) {
- Bukkit.getLogger().log(Level.SEVERE, "stopTiming called async for " + name);
- new Throwable().printStackTrace();
- }
- start = 0;
- return;
- }
}
- // Akarin end
addDiff(System.nanoTime() - start);
start = 0;
}
diff --git a/sources/src/main/java/io/akarin/server/mixin/core/MixinTimingHandler.java b/sources/src/main/java/io/akarin/server/mixin/core/MixinTimingHandler.java
new file mode 100644
index 000000000..60435de04
--- /dev/null
+++ b/sources/src/main/java/io/akarin/server/mixin/core/MixinTimingHandler.java
@@ -0,0 +1,55 @@
+package io.akarin.server.mixin.core;
+
+import java.util.logging.Level;
+
+import org.bukkit.Bukkit;
+import org.spongepowered.asm.mixin.Final;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Overwrite;
+import org.spongepowered.asm.mixin.Shadow;
+
+import io.akarin.api.Akari;
+import io.akarin.server.core.AkarinGlobalConfig;
+
+@Mixin(targets = "co.aikar.timings.TimingHandler", remap = false)
+public class MixinTimingHandler {
+ @Shadow @Final String name;
+ @Shadow private boolean enabled;
+ @Shadow private volatile long start;
+ @Shadow private volatile int timingDepth;
+
+ @Overwrite
+ public void stopTimingIfSync() {
+ if (Bukkit.isPrimaryThread()) {
+ stopTiming(true); // Avoid twice thread check
+ }
+ }
+
+ @Overwrite
+ public void stopTiming() {
+ // Akarin start - avoid twice thread check
+ stopTiming(false);
+ }
+
+ @Shadow void addDiff(long diff) {}
+
+ public void stopTiming(boolean sync) {
+ if (enabled && --timingDepth == 0 && start != 0) {
+ if (Akari.silentTiming) { // It must be off-main thread now
+ start = 0;
+ return;
+ } else {
+ if (!sync && !Bukkit.isPrimaryThread()) {
+ if (AkarinGlobalConfig.silentAsyncTimings) {
+ Bukkit.getLogger().log(Level.SEVERE, "stopTiming called async for " + name);
+ new Throwable().printStackTrace();
+ }
+ start = 0;
+ return;
+ }
+ }
+ addDiff(System.nanoTime() - start);
+ start = 0;
+ }
+ }
+}
diff --git a/sources/src/main/resources/mixins.akarin.core.json b/sources/src/main/resources/mixins.akarin.core.json
index e6cc338f4..86e5f79e4 100644
--- a/sources/src/main/resources/mixins.akarin.core.json
+++ b/sources/src/main/resources/mixins.akarin.core.json
@@ -11,6 +11,7 @@
"bootstrap.MixinMetrics",
"bootstrap.ParallelRegistry",
"bootstrap.MetricsBootstrap",
+ "bootstrap.MixinTimingHandler",
"core.MixinMCUtil",
"core.WeakBigTree",