diff --git a/src/api/main/java/co/aikar/timings/TimingHandler.java b/src/api/main/java/co/aikar/timings/TimingHandler.java index 5167d4573..d01f2b731 100644 --- a/src/api/main/java/co/aikar/timings/TimingHandler.java +++ b/src/api/main/java/co/aikar/timings/TimingHandler.java @@ -41,7 +41,7 @@ import org.bukkit.Bukkit; class TimingHandler implements Timing { private static AtomicInteger idPool = new AtomicInteger(1); - static Deque TIMING_STACK = new ArrayDeque<>(); + private static Deque TIMING_STACK = new ArrayDeque<>(); final int id = idPool.getAndIncrement(); final TimingIdentifier identifier; @@ -151,10 +151,16 @@ class TimingHandler implements Timing { public void stopTiming() { if (enabled && timingDepth > 0 && (ThreadAssertion.isMainThread() || Bukkit.isPrimaryThread()) && --timingDepth == 0 && start != 0) { // Akarin - TimingHandler last = TIMING_STACK.removeLast(); - if (last != this) { - Logger.getGlobal().log(Level.SEVERE, "TIMING_STACK_CORRUPTION - Report this to Paper! ( " + this.identifier + ":" + last +")", new Throwable()); - TIMING_STACK.addLast(last); // Add it back + TimingHandler last; + while ((last = TIMING_STACK.removeLast()) != this) { + last.timingDepth = 0; + String reportTo; + if ("minecraft".equals(last.identifier.group)) { + reportTo = "Paper! This is a potential bug in Paper"; + } else { + reportTo = "the plugin " + last.identifier.group + "(Look for errors above this in the logs)"; + } + Logger.getGlobal().log(Level.SEVERE, "TIMING_STACK_CORRUPTION - Report this to " + reportTo + " (" + last.identifier +" did not stopTiming)", new Throwable()); } addDiff(System.nanoTime() - start, TIMING_STACK.peekLast()); diff --git a/src/main/java/co/aikar/timings/MinecraftTimings.java b/src/main/java/co/aikar/timings/MinecraftTimings.java index 51b7270eb..987727a94 100644 --- a/src/main/java/co/aikar/timings/MinecraftTimings.java +++ b/src/main/java/co/aikar/timings/MinecraftTimings.java @@ -52,7 +52,7 @@ public final class MinecraftTimings { */ public static Timing getPluginTaskTimings(BukkitTask bukkitTask, long period) { if (!bukkitTask.isSync()) { - return null; + return NullTimingHandler.NULL; } Plugin plugin; diff --git a/src/main/java/org/bukkit/craftbukkit/scheduler/CraftTask.java b/src/main/java/org/bukkit/craftbukkit/scheduler/CraftTask.java index 87cbd3e2f..0d9a46680 100644 --- a/src/main/java/org/bukkit/craftbukkit/scheduler/CraftTask.java +++ b/src/main/java/org/bukkit/craftbukkit/scheduler/CraftTask.java @@ -1,6 +1,8 @@ package org.bukkit.craftbukkit.scheduler; import java.util.function.Consumer; + +import co.aikar.timings.NullTimingHandler; import org.bukkit.Bukkit; import co.aikar.timings.MinecraftTimings; // Paper import co.aikar.timings.Timing; // Paper @@ -57,7 +59,7 @@ public class CraftTask implements BukkitTask, Runnable { // Spigot } this.id = id; this.period = period; - timings = task != null ? MinecraftTimings.getPluginTaskTimings(this, period) : null; // Paper + timings = task != null ? MinecraftTimings.getPluginTaskTimings(this, period) : NullTimingHandler.NULL; // Paper } @Override @@ -77,13 +79,13 @@ public class CraftTask implements BukkitTask, Runnable { // Spigot @Override public void run() { - if (timings != null && isSync()) timings.startTimingUnsafe(); // Paper + try (Timing ignored = timings.startTiming()) { // Paper if (rTask != null) { rTask.run(); } else { cTask.accept(this); } - if (timings != null && isSync()) timings.stopTimingUnsafe(); // Paper + } // Paper } long getPeriod() {