From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: AlphaKR93 Date: Wed, 15 May 2024 12:43:03 +0900 Subject: [PATCH] Remove remaining timings implementations diff --git a/src/main/java/co/aikar/timings/FullServerTickHandler.java b/src/main/java/co/aikar/timings/FullServerTickHandler.java index 36b8fe86335df851f9c85d6bb2a91368b4d945d1..0f27c3959806aa7a7e8968fdb3659df54bec92aa 100644 --- a/src/main/java/co/aikar/timings/FullServerTickHandler.java +++ b/src/main/java/co/aikar/timings/FullServerTickHandler.java @@ -1,86 +1,4 @@ package co.aikar.timings; -import static co.aikar.timings.TimingsManager.*; - -import org.bukkit.Bukkit; -import org.jetbrains.annotations.NotNull; - @Deprecated(forRemoval = true) -public class FullServerTickHandler extends TimingHandler { - private static final TimingIdentifier IDENTITY = new TimingIdentifier("Minecraft", "Full Server Tick", null); - final TimingData minuteData; - double avgFreeMemory = -1D; - double avgUsedMemory = -1D; - FullServerTickHandler() { - super(IDENTITY); - minuteData = new TimingData(id); - - TIMING_MAP.put(IDENTITY, this); - } - - @NotNull - @Override - public Timing startTiming() { - if (TimingsManager.needsFullReset) { - TimingsManager.resetTimings(); - } else if (TimingsManager.needsRecheckEnabled) { - TimingsManager.recheckEnabled(); - } - return super.startTiming(); - } - - @Override - public void stopTiming() { - super.stopTiming(); - if (!isEnabled()) { - return; - } - if (TimingHistory.timedTicks % 20 == 0) { - final Runtime runtime = Runtime.getRuntime(); - double usedMemory = runtime.totalMemory() - runtime.freeMemory(); - double freeMemory = runtime.maxMemory() - usedMemory; - if (this.avgFreeMemory == -1) { - this.avgFreeMemory = freeMemory; - } else { - this.avgFreeMemory = (this.avgFreeMemory * (59 / 60D)) + (freeMemory * (1 / 60D)); - } - - if (this.avgUsedMemory == -1) { - this.avgUsedMemory = usedMemory; - } else { - this.avgUsedMemory = (this.avgUsedMemory * (59 / 60D)) + (usedMemory * (1 / 60D)); - } - } - - long start = System.nanoTime(); - TimingsManager.tick(); - long diff = System.nanoTime() - start; - TIMINGS_TICK.addDiff(diff, null); - // addDiff for TIMINGS_TICK incremented this, bring it back down to 1 per tick. - record.setCurTickCount(record.getCurTickCount()-1); - - minuteData.setCurTickTotal(record.getCurTickTotal()); - minuteData.setCurTickCount(1); - - boolean violated = isViolated(); - minuteData.processTick(violated); - TIMINGS_TICK.processTick(violated); - processTick(violated); - - - if (TimingHistory.timedTicks % 1200 == 0) { - MINUTE_REPORTS.add(new TimingHistory.MinuteReport()); - TimingHistory.resetTicks(false); - minuteData.reset(); - } - if (TimingHistory.timedTicks % Timings.getHistoryInterval() == 0) { - TimingsManager.HISTORY.add(new TimingHistory()); - TimingsManager.resetTimings(); - } - Bukkit.getUnsafe().reportTimings(); - } - - boolean isViolated() { - return record.getCurTickTotal() > 50000000; - } -} +interface FullServerTickHandler {} // Thunderbolt - Remove remaining timings implementations diff --git a/src/main/java/co/aikar/timings/NullTimingHandler.java b/src/main/java/co/aikar/timings/NullTimingHandler.java index 81671cf40feeed2844ee8d92348d48062aaf2c46..086213790ee15fe22a7d19452cdb498c49a95c4d 100644 --- a/src/main/java/co/aikar/timings/NullTimingHandler.java +++ b/src/main/java/co/aikar/timings/NullTimingHandler.java @@ -1,69 +1,4 @@ -/* - * This file is licensed under the MIT License (MIT). - * - * Copyright (c) 2014 Daniel Ennis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ package co.aikar.timings; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - @Deprecated(forRemoval = true) -public final class NullTimingHandler implements Timing { - public static final Timing NULL = new NullTimingHandler(); - @NotNull - @Override - public Timing startTiming() { - return this; - } - - @Override - public void stopTiming() { - - } - - @NotNull - @Override - public Timing startTimingIfSync() { - return this; - } - - @Override - public void stopTimingIfSync() { - - } - - @Override - public void abort() { - - } - - @Nullable - @Override - public TimingHandler getTimingHandler() { - return null; - } - - @Override - public void close() { - - } -} +interface NullTimingHandler {} // Thunderbolt - Remove remaining timings implementations diff --git a/src/main/java/co/aikar/timings/TimedEventExecutor.java b/src/main/java/co/aikar/timings/TimedEventExecutor.java index 6fbc64e0f214d0c8e5afcbe385e414a4e1fe1c72..4399d4ed4183ed9b91c2ea68fd0b07c4bf8a098f 100644 --- a/src/main/java/co/aikar/timings/TimedEventExecutor.java +++ b/src/main/java/co/aikar/timings/TimedEventExecutor.java @@ -1,90 +1,4 @@ -/* - * This file is licensed under the MIT License (MIT). - * - * Copyright (c) 2014 Daniel Ennis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ package co.aikar.timings; -import org.bukkit.Bukkit; -import org.bukkit.event.Event; -import org.bukkit.event.EventException; -import org.bukkit.event.Listener; -import org.bukkit.plugin.EventExecutor; -import org.bukkit.plugin.Plugin; - -import java.lang.reflect.Method; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - @Deprecated(forRemoval = true) -public class TimedEventExecutor implements EventExecutor { - - private final EventExecutor executor; - private final Timing timings; - - /** - * Wraps an event executor and associates a timing handler to it. - * - * @param executor Executor to wrap - * @param plugin Owning plugin - * @param method EventHandler method - * @param eventClass Owning class - */ - public TimedEventExecutor(@NotNull EventExecutor executor, @NotNull Plugin plugin, @Nullable Method method, @NotNull Class eventClass) { - this.executor = executor; - String id; - - if (method == null) { - if (executor.getClass().getEnclosingClass() != null) { // Oh Skript, how we love you - method = executor.getClass().getEnclosingMethod(); - } - } - - if (method != null) { - id = method.getDeclaringClass().getName(); - } else { - id = executor.getClass().getName(); - } - - - final String eventName = eventClass.getSimpleName(); - boolean verbose = "BlockPhysicsEvent".equals(eventName); - this.timings = Timings.ofSafe(plugin, (verbose ? "## " : "") + - "Event: " + id + " (" + eventName + ")"); - } - - @Override - public void execute(@NotNull Listener listener, @NotNull Event event) throws EventException { - if (event.isAsynchronous() || !Timings.timingsEnabled || !Bukkit.isPrimaryThread()) { - executor.execute(listener, event); - return; - } - //try (Timing ignored = timings.startTiming()){ // Purpur - executor.execute(listener, event); - //} // Purpur - } - - @Override - @NotNull - public String toString() { - return "TimedEventExecutor['" + this.executor.toString() + "']"; - } -} +interface TimedEventExecutor {} // Thunderbolt - Remove remaining timings implementations diff --git a/src/main/java/co/aikar/timings/Timing.java b/src/main/java/co/aikar/timings/Timing.java index 1d866e980abc542bdfee1ce082cd9cdd7761e9f7..e6b4d724f2a4540fbd59c36a5fe9526ab214df68 100644 --- a/src/main/java/co/aikar/timings/Timing.java +++ b/src/main/java/co/aikar/timings/Timing.java @@ -39,6 +39,7 @@ public interface Timing extends AutoCloseable { * @return Timing */ @NotNull + @Deprecated(forRemoval = true) // Thunderbolt - Remove remaining timings implementations @io.papermc.paper.annotation.DoNotUse // Purpur Timing startTiming(); @@ -47,6 +48,7 @@ public interface Timing extends AutoCloseable { * * Will automatically be called when this Timing is used with try-with-resources */ + @Deprecated(forRemoval = true) // Thunderbolt - Remove remaining timings implementations @io.papermc.paper.annotation.DoNotUse // Purpur void stopTiming(); @@ -58,6 +60,7 @@ public interface Timing extends AutoCloseable { * @return Timing */ @NotNull + @Deprecated(forRemoval = true) // Thunderbolt - Remove remaining timings implementations @io.papermc.paper.annotation.DoNotUse // Purpur Timing startTimingIfSync(); @@ -68,13 +71,14 @@ public interface Timing extends AutoCloseable { * * But only if we are on the primary thread. */ + @Deprecated(forRemoval = true) // Thunderbolt - Remove remaining timings implementations @io.papermc.paper.annotation.DoNotUse // Purpur void stopTimingIfSync(); /** * @deprecated Doesn't do anything - Removed */ - @Deprecated + @Deprecated(forRemoval = true) // Thunderbolt - Remove remaining timings implementations @io.papermc.paper.annotation.DoNotUse // Purpur void abort(); @@ -84,9 +88,11 @@ public interface Timing extends AutoCloseable { * @return TimingHandler */ @Nullable - TimingHandler getTimingHandler(); + @Deprecated(forRemoval = true) @io.papermc.paper.annotation.DoNotUse // Thunderbolt - Remove remaining timings implementations + Object getTimingHandler(); // Thunderbolt - Remove remaining timings implementations @Override + @Deprecated(forRemoval = true) // Thunderbolt - Remove remaining timings implementations @io.papermc.paper.annotation.DoNotUse // Purpur void close(); } diff --git a/src/main/java/co/aikar/timings/TimingData.java b/src/main/java/co/aikar/timings/TimingData.java index a5d13a1e44edb861f45c83a9b4309fbf799d407d..596fc185ecd2e7552b6e8b06b0814fc5bc5416ed 100644 --- a/src/main/java/co/aikar/timings/TimingData.java +++ b/src/main/java/co/aikar/timings/TimingData.java @@ -1,122 +1,4 @@ -/* - * This file is licensed under the MIT License (MIT). - * - * Copyright (c) 2014 Daniel Ennis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ package co.aikar.timings; -import java.util.List; -import org.jetbrains.annotations.NotNull; - -import static co.aikar.util.JSONUtil.toArray; - -/** - *

Lightweight object for tracking timing data

- * - * This is broken out to reduce memory usage - */ -class TimingData { - private final int id; - private int count = 0; - private int lagCount = 0; - private long totalTime = 0; - private long lagTotalTime = 0; - private int curTickCount = 0; - private long curTickTotal = 0; - - TimingData(int id) { - this.id = id; - } - - private TimingData(TimingData data) { - this.id = data.id; - this.totalTime = data.totalTime; - this.lagTotalTime = data.lagTotalTime; - this.count = data.count; - this.lagCount = data.lagCount; - } - - void add(long diff) { - ++curTickCount; - curTickTotal += diff; - } - - void processTick(boolean violated) { - totalTime += curTickTotal; - count += curTickCount; - if (violated) { - lagTotalTime += curTickTotal; - lagCount += curTickCount; - } - curTickTotal = 0; - curTickCount = 0; - } - - void reset() { - count = 0; - lagCount = 0; - curTickTotal = 0; - curTickCount = 0; - totalTime = 0; - lagTotalTime = 0; - } - - protected TimingData clone() { - return new TimingData(this); - } - - @NotNull - List export() { - List list = toArray( - id, - count, - totalTime); - if (lagCount > 0) { - list.add(lagCount); - list.add(lagTotalTime); - } - return list; - } - - boolean hasData() { - return count > 0; - } - - long getTotalTime() { - return totalTime; - } - - int getCurTickCount() { - return curTickCount; - } - - void setCurTickCount(int curTickCount) { - this.curTickCount = curTickCount; - } - - long getCurTickTotal() { - return curTickTotal; - } - - void setCurTickTotal(long curTickTotal) { - this.curTickTotal = curTickTotal; - } -} +@Deprecated(forRemoval = true) // Thunderbolt - Remove remaining timings implementations +interface TimingData {} // Thunderbolt - Remove remaining timings implementations diff --git a/src/main/java/co/aikar/timings/TimingHandler.java b/src/main/java/co/aikar/timings/TimingHandler.java index 3b3bcfa6fa2dbcc7fef899cc7570da097437ab3a..c8872cc0f5ffd3036ac53358e3f2c37782685a5f 100644 --- a/src/main/java/co/aikar/timings/TimingHandler.java +++ b/src/main/java/co/aikar/timings/TimingHandler.java @@ -1,226 +1,4 @@ -/* - * This file is licensed under the MIT License (MIT). - * - * Copyright (c) 2014 Daniel Ennis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ package co.aikar.timings; -import co.aikar.util.LoadingIntMap; -import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; - -import java.util.ArrayDeque; -import java.util.Deque; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.logging.Level; -import java.util.logging.Logger; - -import org.bukkit.Bukkit; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -class TimingHandler implements Timing { - - private static AtomicInteger idPool = new AtomicInteger(1); - private static Deque TIMING_STACK = new ArrayDeque<>(); - final int id = idPool.getAndIncrement(); - - final TimingIdentifier identifier; - private final boolean verbose; - - private final Int2ObjectOpenHashMap children = new LoadingIntMap<>(TimingData::new); - - final TimingData record; - private TimingHandler startParent; - private final TimingHandler groupHandler; - - private long start = 0; - private int timingDepth = 0; - private boolean added; - private boolean timed; - private boolean enabled; - - TimingHandler(@NotNull TimingIdentifier id) { - this.identifier = id; - this.verbose = id.name.startsWith("##"); - this.record = new TimingData(this.id); - this.groupHandler = id.groupHandler; - - TimingIdentifier.getGroup(id.group).handlers.add(this); - checkEnabled(); - } - - final void checkEnabled() { - enabled = Timings.timingsEnabled && (!verbose || Timings.verboseEnabled); - } - - void processTick(boolean violated) { - if (timingDepth != 0 || record.getCurTickCount() == 0) { - timingDepth = 0; - start = 0; - return; - } - - record.processTick(violated); - for (TimingData handler : children.values()) { - handler.processTick(violated); - } - } - - @NotNull - @Override - public Timing startTimingIfSync() { - startTiming(); - return this; - } - - @Override - public void stopTimingIfSync() { - stopTiming(); - } - - @NotNull - public Timing startTiming() { - if (!enabled || !Bukkit.isPrimaryThread()) { - return this; - } - if (++timingDepth == 1) { - startParent = TIMING_STACK.peekLast(); - start = System.nanoTime(); - } - TIMING_STACK.addLast(this); - return this; - } - - public void stopTiming() { - if (!enabled || timingDepth <= 0 || start == 0 || !Bukkit.isPrimaryThread()) { - return; - } - - popTimingStack(); - if (--timingDepth == 0) { - addDiff(System.nanoTime() - start, startParent); - startParent = null; - start = 0; - } - } - - private void popTimingStack() { - TimingHandler last; - while ((last = TIMING_STACK.removeLast()) != this) { - last.timingDepth = 0; - if ("Minecraft".equalsIgnoreCase(last.identifier.group)) { - Logger.getGlobal().log(Level.SEVERE, "TIMING_STACK_CORRUPTION - Look above this for any errors and report this to " + io.papermc.paper.ServerBuildInfo.buildInfo().brandName() + " unless it has a plugin in the stack trace (" + last.identifier + " did not stopTiming)"); - } else { - Logger.getGlobal().log(Level.SEVERE, "TIMING_STACK_CORRUPTION - Report this to the plugin " + last.identifier.group + " (Look for errors above this in the logs) (" + last.identifier + " did not stopTiming)", new Throwable()); - } - - boolean found = TIMING_STACK.contains(this); - if (!found) { - // We aren't even in the stack... Don't pop everything - TIMING_STACK.addLast(last); - break; - } - } - } - - @Override - public final void abort() { - - } - - void addDiff(long diff, @Nullable TimingHandler parent) { - if (parent != null) { - parent.children.get(id).add(diff); - } - - record.add(diff); - if (!added) { - added = true; - timed = true; - TimingsManager.HANDLERS.add(this); - } - if (groupHandler != null) { - groupHandler.addDiff(diff, parent); - groupHandler.children.get(id).add(diff); - } - } - - /** - * Reset this timer, setting all values to zero. - */ - void reset(boolean full) { - record.reset(); - if (full) { - timed = false; - } - start = 0; - timingDepth = 0; - added = false; - children.clear(); - checkEnabled(); - } - - @NotNull - @Override - public TimingHandler getTimingHandler() { - return this; - } - - @Override - public boolean equals(Object o) { - return (this == o); - } - - @Override - public int hashCode() { - return id; - } - - /** - * This is simply for the Closeable interface so it can be used with try-with-resources () - */ - @Override - public void close() { - stopTimingIfSync(); - } - - public boolean isSpecial() { - return this == TimingsManager.FULL_SERVER_TICK || this == TimingsManager.TIMINGS_TICK; - } - - boolean isTimed() { - return timed; - } - - public boolean isEnabled() { - return enabled; - } - - @NotNull - TimingData[] cloneChildren() { - final TimingData[] clonedChildren = new TimingData[children.size()]; - int i = 0; - for (TimingData child : children.values()) { - clonedChildren[i++] = child.clone(); - } - return clonedChildren; - } -} +@Deprecated(forRemoval = true) // Thunderbolt - Remove remaining timings implementations +interface TimingHandler {} // Thunderbolt - Remove remaining timings implementations diff --git a/src/main/java/co/aikar/timings/TimingHistory.java b/src/main/java/co/aikar/timings/TimingHistory.java index 02e88db63be2d5e31da6b65157ba7b971b1f10f3..7ddaad45f563796b442ac3f5a757e78d5cb4bb5b 100644 --- a/src/main/java/co/aikar/timings/TimingHistory.java +++ b/src/main/java/co/aikar/timings/TimingHistory.java @@ -1,355 +1,4 @@ -/* - * This file is licensed under the MIT License (MIT). - * - * Copyright (c) 2014 Daniel Ennis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ package co.aikar.timings; -import co.aikar.timings.TimingHistory.RegionData.RegionId; -import com.google.common.base.Function; -import com.google.common.collect.Sets; -import org.bukkit.Bukkit; -import org.bukkit.Chunk; -import org.bukkit.Material; -import org.bukkit.World; -import org.bukkit.block.BlockState; -import org.bukkit.entity.Entity; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.Player; -import co.aikar.util.LoadingMap; -import co.aikar.util.MRUMapCache; - -import java.lang.management.ManagementFactory; -import java.util.Collection; -import java.util.EnumMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import static co.aikar.timings.TimingsManager.FULL_SERVER_TICK; -import static co.aikar.timings.TimingsManager.MINUTE_REPORTS; -import static co.aikar.util.JSONUtil.*; - @Deprecated(forRemoval = true) -@SuppressWarnings({"deprecation", "SuppressionAnnotation", "Convert2Lambda", "Anonymous2MethodRef"}) -public class TimingHistory { - public static long lastMinuteTime; - public static long timedTicks; - public static long playerTicks; - public static long entityTicks; - public static long tileEntityTicks; - public static long activatedEntityTicks; - private static int worldIdPool = 1; - static Map worldMap = LoadingMap.newHashMap(new Function() { - @NotNull - @Override - public Integer apply(@Nullable String input) { - return worldIdPool++; - } - }); - private final long endTime; - private final long startTime; - private final long totalTicks; - private final long totalTime; // Represents all time spent running the server this history - private final MinuteReport[] minuteReports; - - private final TimingHistoryEntry[] entries; - final Set tileEntityTypeSet = Sets.newHashSet(); - final Set entityTypeSet = Sets.newHashSet(); - private final Map worlds; - - TimingHistory() { - this.endTime = System.currentTimeMillis() / 1000; - this.startTime = TimingsManager.historyStart / 1000; - if (timedTicks % 1200 != 0 || MINUTE_REPORTS.isEmpty()) { - this.minuteReports = MINUTE_REPORTS.toArray(new MinuteReport[MINUTE_REPORTS.size() + 1]); - this.minuteReports[this.minuteReports.length - 1] = new MinuteReport(); - } else { - this.minuteReports = MINUTE_REPORTS.toArray(new MinuteReport[MINUTE_REPORTS.size()]); - } - long ticks = 0; - for (MinuteReport mp : this.minuteReports) { - ticks += mp.ticksRecord.timed; - } - this.totalTicks = ticks; - this.totalTime = FULL_SERVER_TICK.record.getTotalTime(); - this.entries = new TimingHistoryEntry[TimingsManager.HANDLERS.size()]; - - int i = 0; - for (TimingHandler handler : TimingsManager.HANDLERS) { - entries[i++] = new TimingHistoryEntry(handler); - } - - // Information about all loaded chunks/entities - //noinspection unchecked - this.worlds = toObjectMapper(Bukkit.getWorlds(), new Function() { - @NotNull - @Override - public JSONPair apply(World world) { - Map regions = LoadingMap.newHashMap(RegionData.LOADER); - - for (Chunk chunk : world.getLoadedChunks()) { - RegionData data = regions.get(new RegionId(chunk.getX(), chunk.getZ())); - - for (Entity entity : chunk.getEntities()) { - if (entity == null) { - Bukkit.getLogger().warning("Null entity detected in chunk at position x: " + chunk.getX() + ", z: " + chunk.getZ()); - continue; - } - - data.entityCounts.get(entity.getType()).increment(); - } - - for (BlockState tileEntity : chunk.getTileEntities(false)) { - if (tileEntity == null) { - Bukkit.getLogger().warning("Null tileentity detected in chunk at position x: " + chunk.getX() + ", z: " + chunk.getZ()); - continue; - } - - data.tileEntityCounts.get(tileEntity.getBlock().getType()).increment(); - } - } - return pair( - worldMap.get(world.getName()), - toArrayMapper(regions.values(),new Function() { - @NotNull - @Override - public Object apply(RegionData input) { - return toArray( - input.regionId.x, - input.regionId.z, - toObjectMapper(input.entityCounts.entrySet(), - new Function, JSONPair>() { - @NotNull - @Override - public JSONPair apply(Map.Entry entry) { - entityTypeSet.add(entry.getKey()); - return pair( - String.valueOf(entry.getKey().ordinal()), - entry.getValue().count() - ); - } - } - ), - toObjectMapper(input.tileEntityCounts.entrySet(), - new Function, JSONPair>() { - @NotNull - @Override - public JSONPair apply(Map.Entry entry) { - tileEntityTypeSet.add(entry.getKey()); - return pair( - String.valueOf(entry.getKey().ordinal()), - entry.getValue().count() - ); - } - } - ) - ); - } - }) - ); - } - }); - } - static class RegionData { - final RegionId regionId; - @SuppressWarnings("Guava") - static Function LOADER = new Function() { - @NotNull - @Override - public RegionData apply(@NotNull RegionId id) { - return new RegionData(id); - } - }; - RegionData(@NotNull RegionId id) { - this.regionId = id; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - - RegionData that = (RegionData) o; - - return regionId.equals(that.regionId); - - } - - @Override - public int hashCode() { - return regionId.hashCode(); - } - - @SuppressWarnings("unchecked") - final Map entityCounts = MRUMapCache.of(LoadingMap.of( - new EnumMap(EntityType.class), k -> new Counter() - )); - @SuppressWarnings("unchecked") - final Map tileEntityCounts = MRUMapCache.of(LoadingMap.of( - new EnumMap(Material.class), k -> new Counter() - )); - - static class RegionId { - final int x, z; - final long regionId; - RegionId(int x, int z) { - this.x = x >> 5 << 5; - this.z = z >> 5 << 5; - this.regionId = ((long) (this.x) << 32) + (this.z >> 5 << 5) - Integer.MIN_VALUE; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - RegionId regionId1 = (RegionId) o; - - return regionId == regionId1.regionId; - - } - - @Override - public int hashCode() { - return (int) (regionId ^ (regionId >>> 32)); - } - } - } - static void resetTicks(boolean fullReset) { - if (fullReset) { - // Non full is simply for 1 minute reports - timedTicks = 0; - } - lastMinuteTime = System.nanoTime(); - playerTicks = 0; - tileEntityTicks = 0; - entityTicks = 0; - activatedEntityTicks = 0; - } - - @NotNull - Object export() { - return createObject( - pair("s", startTime), - pair("e", endTime), - pair("tk", totalTicks), - pair("tm", totalTime), - pair("w", worlds), - pair("h", toArrayMapper(entries, new Function() { - @Nullable - @Override - public Object apply(TimingHistoryEntry entry) { - TimingData record = entry.data; - if (!record.hasData()) { - return null; - } - return entry.export(); - } - })), - pair("mp", toArrayMapper(minuteReports, new Function() { - @NotNull - @Override - public Object apply(MinuteReport input) { - return input.export(); - } - })) - ); - } - - static class MinuteReport { - final long time = System.currentTimeMillis() / 1000; - - final TicksRecord ticksRecord = new TicksRecord(); - final PingRecord pingRecord = new PingRecord(); - final TimingData fst = TimingsManager.FULL_SERVER_TICK.minuteData.clone(); - final double tps = 1E9 / ( System.nanoTime() - lastMinuteTime ) * ticksRecord.timed; - final double usedMemory = TimingsManager.FULL_SERVER_TICK.avgUsedMemory; - final double freeMemory = TimingsManager.FULL_SERVER_TICK.avgFreeMemory; - final double loadAvg = ManagementFactory.getOperatingSystemMXBean().getSystemLoadAverage(); - - @NotNull - List export() { - return toArray( - time, - Math.round(tps * 100D) / 100D, - Math.round(pingRecord.avg * 100D) / 100D, - fst.export(), - toArray(ticksRecord.timed, - ticksRecord.player, - ticksRecord.entity, - ticksRecord.activatedEntity, - ticksRecord.tileEntity - ), - usedMemory, - freeMemory, - loadAvg - ); - } - } - - private static class TicksRecord { - final long timed; - final long player; - final long entity; - final long tileEntity; - final long activatedEntity; - - TicksRecord() { - timed = timedTicks - (TimingsManager.MINUTE_REPORTS.size() * 1200); - player = playerTicks; - entity = entityTicks; - tileEntity = tileEntityTicks; - activatedEntity = activatedEntityTicks; - } - - } - - private static class PingRecord { - final double avg; - - PingRecord() { - final Collection onlinePlayers = Bukkit.getOnlinePlayers(); - int totalPing = 0; - for (Player player : onlinePlayers) { - totalPing += player.spigot().getPing(); - } - avg = onlinePlayers.isEmpty() ? 0 : totalPing / onlinePlayers.size(); - } - } - - - private static class Counter { - private int count = 0; - public int increment() { - return ++count; - } - public int count() { - return count; - } - } -} +interface TimingHistory {} // Thunderbolt - Remove remaining timings implementations diff --git a/src/main/java/co/aikar/timings/TimingHistoryEntry.java b/src/main/java/co/aikar/timings/TimingHistoryEntry.java index 86d5ac6bd0d7d0003688761aceb3f3343575319f..96cb33a8b1282dd04fe00b69231c78d41b52d92b 100644 --- a/src/main/java/co/aikar/timings/TimingHistoryEntry.java +++ b/src/main/java/co/aikar/timings/TimingHistoryEntry.java @@ -1,58 +1,4 @@ -/* - * This file is licensed under the MIT License (MIT). - * - * Copyright (c) 2014 Daniel Ennis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ package co.aikar.timings; -import com.google.common.base.Function; - -import java.util.List; -import org.jetbrains.annotations.NotNull; - -import static co.aikar.util.JSONUtil.toArrayMapper; - -class TimingHistoryEntry { - final TimingData data; - private final TimingData[] children; - - TimingHistoryEntry(@NotNull TimingHandler handler) { - this.data = handler.record.clone(); - children = handler.cloneChildren(); - } - - @NotNull - List export() { - List result = data.export(); - if (children.length > 0) { - result.add( - toArrayMapper(children, new Function() { - @NotNull - @Override - public Object apply(TimingData child) { - return child.export(); - } - }) - ); - } - return result; - } -} +@Deprecated(forRemoval = true) // Thunderbolt - Remove remaining timings implementations +interface TimingHistoryEntry {} // Thunderbolt - Remove remaining timings implementations diff --git a/src/main/java/co/aikar/timings/TimingIdentifier.java b/src/main/java/co/aikar/timings/TimingIdentifier.java index df142a89b8c43acb81eb383eac0ef048a1f49a6e..a921bd54d2e5346081e96ecf4da1553e2b23ac9c 100644 --- a/src/main/java/co/aikar/timings/TimingIdentifier.java +++ b/src/main/java/co/aikar/timings/TimingIdentifier.java @@ -1,116 +1,4 @@ -/* - * This file is licensed under the MIT License (MIT). - * - * Copyright (c) 2014 Daniel Ennis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ package co.aikar.timings; -import co.aikar.util.LoadingMap; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.atomic.AtomicInteger; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -/** - *

Used as a basis for fast HashMap key comparisons for the Timing Map.

- * - * This class uses interned strings giving us the ability to do an identity check instead of equals() on the strings - */ -final class TimingIdentifier { - /** - * Holds all groups. Autoloads on request for a group by name. - */ - static final Map GROUP_MAP = LoadingMap.of(new ConcurrentHashMap<>(64, .5F), TimingGroup::new); - private static final TimingGroup DEFAULT_GROUP = getGroup("Minecraft"); - final String group; - final String name; - final TimingHandler groupHandler; - private final int hashCode; - - TimingIdentifier(@Nullable String group, @NotNull String name, @Nullable Timing groupHandler) { - this.group = group != null ? group: DEFAULT_GROUP.name; - this.name = name; - this.groupHandler = groupHandler != null ? groupHandler.getTimingHandler() : null; - this.hashCode = (31 * this.group.hashCode()) + this.name.hashCode(); - } - - @NotNull - static TimingGroup getGroup(@Nullable String groupName) { - if (groupName == null) { - //noinspection ConstantConditions - return DEFAULT_GROUP; - } - - return GROUP_MAP.get(groupName); - } - - @Override - public boolean equals(Object o) { - if (o == null) { - return false; - } - - TimingIdentifier that = (TimingIdentifier) o; - return Objects.equals(group, that.group) && Objects.equals(name, that.name); - } - - @Override - public int hashCode() { - return hashCode; - } - - @Override - public String toString() { - return "TimingIdentifier{id=" + group + ":" + name +'}'; - } - - static class TimingGroup { - - private static AtomicInteger idPool = new AtomicInteger(1); - final int id = idPool.getAndIncrement(); - - final String name; - final List handlers = Collections.synchronizedList(new ArrayList<>(64)); - - private TimingGroup(String name) { - this.name = name; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - TimingGroup that = (TimingGroup) o; - return id == that.id; - } - - @Override - public int hashCode() { - return id; - } - } -} +@Deprecated(forRemoval = true) +interface TimingIdentifier {} // Thunderbolt - Remove remaining timings implementations diff --git a/src/main/java/co/aikar/timings/Timings.java b/src/main/java/co/aikar/timings/Timings.java index 752d54830aa8baa1450bf72da03ae55ed30293c2..8bbd2bfb06a9ba5ad7a87f9b54e048773a79490a 100644 --- a/src/main/java/co/aikar/timings/Timings.java +++ b/src/main/java/co/aikar/timings/Timings.java @@ -44,18 +44,8 @@ import org.jetbrains.annotations.Nullable; * @deprecated Timings will likely be replaced with Spark in the future */ @Deprecated(forRemoval = true) -@SuppressWarnings({"UnusedDeclaration", "WeakerAccess", "SameParameterValue"}) public final class Timings { - final static List requestingReport = Lists.newArrayList(); - private static final int MAX_HISTORY_FRAMES = 12; - public static final Timing NULL_HANDLER = new NullTimingHandler(); - static boolean timingsEnabled = false; - static boolean verboseEnabled = false; - private static int historyInterval = -1; - private static int historyLength = -1; - private static boolean warnedAboutDeprecationOnEnable; - private Timings() {} /** @@ -65,13 +55,9 @@ public final class Timings { * @param name Name of Timing * @return Handler */ - @NotNull + @Deprecated(forRemoval = true) @io.papermc.paper.annotation.DoNotUse // Thunderbolt - Remove remaining timings implementations public static Timing of(@NotNull Plugin plugin, @NotNull String name) { - Timing pluginHandler = null; - if (plugin != null) { - pluginHandler = ofSafe(plugin.getName(), "Combined Total", TimingsManager.PLUGIN_GROUP_HANDLER); - } - return of(plugin, name, pluginHandler); + throw new org.plazmamc.thunderbolt.DeprecatedException("Timings is deprecated and will be removed in the future. Use Spark instead."); // Thunderbolt - Remove remaining timings implementations } /** @@ -86,11 +72,9 @@ public final class Timings { * @param groupHandler Parent handler to mirror .start/stop calls to * @return Timing Handler */ - @NotNull + @Deprecated(forRemoval = true) @io.papermc.paper.annotation.DoNotUse // Thunderbolt - Remove remaining timings implementations // Thunderbolt - Remove remaining timings implementations public static Timing of(@NotNull Plugin plugin, @NotNull String name, @Nullable Timing groupHandler) { - Preconditions.checkNotNull(plugin, "Plugin can not be null"); - Bukkit.getLogger().warning(String.format("Plugin '%s' is creating timing '%s' - this is deprecated behavior, please report it to the authors: %s", plugin.getName(), name, String.join(", ", plugin.getDescription().getAuthors()))); - return TimingsManager.getHandler(plugin.getName(), name, groupHandler); + throw new org.plazmamc.thunderbolt.DeprecatedException("Timings is deprecated and will be removed in the future. Use Spark instead."); // Thunderbolt - Remove remaining timings implementations } /** @@ -104,9 +88,9 @@ public final class Timings { * @param name Name of Timing * @return Timing Handler */ - @NotNull + @Deprecated(forRemoval = true) @io.papermc.paper.annotation.DoNotUse // Thunderbolt - Remove remaining timings implementations public static Timing ofStart(@NotNull Plugin plugin, @NotNull String name) { - return ofStart(plugin, name, null); + throw new org.plazmamc.thunderbolt.DeprecatedException("Timings is deprecated and will be removed in the future. Use Spark instead."); // Thunderbolt - Remove remaining timings implementations } /** @@ -121,11 +105,9 @@ public final class Timings { * @param groupHandler Parent handler to mirror .start/stop calls to * @return Timing Handler */ - @NotNull + @Deprecated(forRemoval = true) @io.papermc.paper.annotation.DoNotUse // Thunderbolt - Remove remaining timings implementations public static Timing ofStart(@NotNull Plugin plugin, @NotNull String name, @Nullable Timing groupHandler) { - Timing timing = of(plugin, name, groupHandler); - //timing.startTiming(); // Purpur - return timing; + throw new org.plazmamc.thunderbolt.DeprecatedException("Timings is deprecated and will be removed in the future. Use Spark instead."); // Thunderbolt - Remove remaining timings implementations } /** @@ -133,8 +115,9 @@ public final class Timings { * * @return Enabled or not */ + @Deprecated(forRemoval = true) @io.papermc.paper.annotation.DoNotUse // Thunderbolt - Remove remaining timings implementations public static boolean isTimingsEnabled() { - return timingsEnabled; + return false; // Thunderbolt - Remove remaining timings implementations } /** @@ -144,42 +127,9 @@ public final class Timings { * * @param enabled Should timings be reported */ + @Deprecated(forRemoval = true) @io.papermc.paper.annotation.DoNotUse // Thunderbolt - Remove remaining timings implementations public static void setTimingsEnabled(boolean enabled) { - // Purpur start - we don't do that here... - timingsEnabled = false; - //warnAboutDeprecationOnEnable(); - //reset(); - // Purpur end - } - - private static void warnAboutDeprecationOnEnable() { - if (timingsEnabled && !warnedAboutDeprecationOnEnable) { - Bukkit.getLogger().warning(PlainTextComponentSerializer.plainText().serialize(deprecationMessage())); - warnedAboutDeprecationOnEnable = true; - } - } - - public static Component deprecationMessage() { - return Component.text() - .color(TextColor.color(0xf3ef91)) - .append(Component.text("[!] The timings profiler has been enabled but has been scheduled for removal from Paper in the future.")) - .append(Component.newline()) - .append( - Component.text(" We recommend installing the spark profiler as a replacement: ") - .append( - Component.text() - .content("https://spark.lucko.me/") - .clickEvent(ClickEvent.openUrl("https://spark.lucko.me/"))) - ) - .append(Component.newline()) - .append( - Component.text(" For more information please visit: ") - .append( - Component.text() - .content("https://github.com/PaperMC/Paper/issues/8948") - .clickEvent(ClickEvent.openUrl("https://github.com/PaperMC/Paper/issues/8948"))) - ) - .build(); + throw new org.plazmamc.thunderbolt.DeprecatedException("Timings is deprecated and will be removed in the future. Use Spark instead."); // Thunderbolt - Remove remaining timings implementations } /** @@ -189,8 +139,9 @@ public final class Timings { * * @return Enabled or not */ + @Deprecated(forRemoval = true) @io.papermc.paper.annotation.DoNotUse // Thunderbolt - Remove remaining timings implementations public static boolean isVerboseTimingsEnabled() { - return verboseEnabled; + return false; // Thunderbolt - Remove remaining timings implementations } /** @@ -201,9 +152,9 @@ public final class Timings { * * @param enabled Should high-frequency timings be reported */ + @Deprecated(forRemoval = true) @io.papermc.paper.annotation.DoNotUse // Thunderbolt - Remove remaining timings implementations public static void setVerboseTimingsEnabled(boolean enabled) { - verboseEnabled = enabled; - TimingsManager.needsRecheckEnabled = true; + throw new org.plazmamc.thunderbolt.DeprecatedException("Timings is deprecated and will be removed in the future. Use Spark instead."); // Thunderbolt - Remove remaining timings implementations } /** @@ -213,8 +164,9 @@ public final class Timings { * * @return Interval in ticks */ + @Deprecated(forRemoval = true) @io.papermc.paper.annotation.DoNotUse // Thunderbolt - Remove remaining timings implementations public static int getHistoryInterval() { - return historyInterval; + throw new org.plazmamc.thunderbolt.DeprecatedException("Timings is deprecated and will be removed in the future. Use Spark instead."); // Thunderbolt - Remove remaining timings implementations } /** @@ -227,12 +179,8 @@ public final class Timings { * * @param interval Interval in ticks */ - public static void setHistoryInterval(int interval) { - historyInterval = Math.max(20*60, interval); - // Recheck the history length with the new Interval - if (historyLength != -1) { - setHistoryLength(historyLength); - } + @Deprecated(forRemoval = true) @io.papermc.paper.annotation.DoNotUse // Thunderbolt - Remove remaining timings implementations + public static void setHistoryInterval(int interval) {throw new org.plazmamc.thunderbolt.DeprecatedException("Timings is deprecated and will be removed in the future. Use Spark instead."); // Thunderbolt - Remove remaining timings implementations } /** @@ -242,8 +190,9 @@ public final class Timings { * * @return Duration in Ticks */ + @Deprecated(forRemoval = true) @io.papermc.paper.annotation.DoNotUse // Thunderbolt - Remove remaining timings implementations public static int getHistoryLength() { - return historyLength; + throw new org.plazmamc.thunderbolt.DeprecatedException("Timings is deprecated and will be removed in the future. Use Spark instead."); // Thunderbolt - Remove remaining timings implementations } /** @@ -257,30 +206,17 @@ public final class Timings { * * @param length Duration in ticks */ + @Deprecated(forRemoval = true) @io.papermc.paper.annotation.DoNotUse // Thunderbolt - Remove remaining timings implementations public static void setHistoryLength(int length) { - // Cap at 12 History Frames, 1 hour at 5 minute frames. - int maxLength = historyInterval * MAX_HISTORY_FRAMES; - // For special cases of servers with special permission to bypass the max. - // This max helps keep data file sizes reasonable for processing on Aikar's Timing parser side. - // Setting this will not help you bypass the max unless Aikar has added an exception on the API side. - if (System.getProperty("timings.bypassMax") != null) { - maxLength = Integer.MAX_VALUE; - } - historyLength = Math.max(Math.min(maxLength, length), historyInterval); - Queue oldQueue = TimingsManager.HISTORY; - int frames = (getHistoryLength() / getHistoryInterval()); - if (length > maxLength) { - Bukkit.getLogger().log(Level.WARNING, "Timings Length too high. Requested " + length + ", max is " + maxLength + ". To get longer history, you must increase your interval. Set Interval to " + Math.ceil(length / MAX_HISTORY_FRAMES) + " to achieve this length."); - } - TimingsManager.HISTORY = EvictingQueue.create(frames); - TimingsManager.HISTORY.addAll(oldQueue); + throw new org.plazmamc.thunderbolt.DeprecatedException("Timings is deprecated and will be removed in the future. Use Spark instead."); // Thunderbolt - Remove remaining timings implementations } /** * Resets all Timing Data */ + @Deprecated(forRemoval = true) @io.papermc.paper.annotation.DoNotUse // Thunderbolt - Remove remaining timings implementations public static void reset() { - TimingsManager.reset(); + throw new org.plazmamc.thunderbolt.DeprecatedException("Timings is deprecated and will be removed in the future. Use Spark instead."); // Thunderbolt - Remove remaining timings implementations } /** @@ -289,11 +225,9 @@ public final class Timings { * If sender is null, ConsoleCommandSender will be used. * @param sender The sender to send to, or null to use the ConsoleCommandSender */ + @Deprecated(forRemoval = true) @io.papermc.paper.annotation.DoNotUse // Thunderbolt - Remove remaining timings implementations public static void generateReport(@Nullable CommandSender sender) { - if (sender == null) { - sender = Bukkit.getConsoleSender(); - } - requestingReport.add(sender); + throw new org.plazmamc.thunderbolt.DeprecatedException("Timings is deprecated and will be removed in the future. Use Spark instead."); // Thunderbolt - Remove remaining timings implementations } /** @@ -301,39 +235,10 @@ public final class Timings { * Use with {@link org.bukkit.command.BufferedCommandSender} to get full response when done! * @param sender The listener to send responses too. */ - public static void generateReport(@NotNull TimingsReportListener sender) { - Preconditions.checkNotNull(sender); - requestingReport.add(sender); - } - - /* - ================= - Protected API: These are for internal use only in Bukkit/CraftBukkit - These do not have isPrimaryThread() checks in the startTiming/stopTiming - ================= - */ - @NotNull - static TimingHandler ofSafe(@NotNull String name) { - return ofSafe(null, name, null); - } - - @NotNull - static Timing ofSafe(@Nullable Plugin plugin, @NotNull String name) { - Timing pluginHandler = null; - if (plugin != null) { - pluginHandler = ofSafe(plugin.getName(), "Combined Total", TimingsManager.PLUGIN_GROUP_HANDLER); - } - return ofSafe(plugin != null ? plugin.getName() : "Minecraft - Invalid Plugin", name, pluginHandler); + @Deprecated(forRemoval = true) @io.papermc.paper.annotation.DoNotUse // Thunderbolt - Remove remaining timings implementations + public static void generateReport(@NotNull Object sender) { // Thunderbolt - Remove remaining timings implementations + throw new org.plazmamc.thunderbolt.DeprecatedException("Timings is deprecated and will be removed in the future. Use Spark instead."); // Thunderbolt - Remove remaining timings implementations } - @NotNull - static TimingHandler ofSafe(@NotNull String name, @Nullable Timing groupHandler) { - return ofSafe(null, name, groupHandler); - } - - @NotNull - static TimingHandler ofSafe(@Nullable String groupName, @NotNull String name, @Nullable Timing groupHandler) { - return TimingsManager.getHandler(groupName, name, groupHandler); - } } diff --git a/src/main/java/co/aikar/timings/TimingsCommand.java b/src/main/java/co/aikar/timings/TimingsCommand.java index 1abfcee0f6d632f4cd8d74b4994a90c9ea9d254c..1a439fda970eec02c9da65b327da4a21f1afa795 100644 --- a/src/main/java/co/aikar/timings/TimingsCommand.java +++ b/src/main/java/co/aikar/timings/TimingsCommand.java @@ -40,12 +40,12 @@ import static net.kyori.adventure.text.Component.text; @Deprecated(forRemoval = true) public class TimingsCommand extends BukkitCommand { private static final List TIMINGS_SUBCOMMANDS = ImmutableList.of("report", "reset", "on", "off", "paste", "verbon", "verboff"); - private long lastResetAttempt = 0; + // private long lastResetAttempt = 0; public TimingsCommand(@NotNull String name) { super(name); this.description = "Manages Spigot Timings data to see performance of the server."; - this.usageMessage = "/timings";// "; // Purpur + this.usageMessage = "/timings "; // Purpur // Thunderbolt this.setPermission("bukkit.command.timings"); } @@ -54,61 +54,12 @@ public class TimingsCommand extends BukkitCommand { if (!testPermission(sender)) { return true; } - if (true) { - net.kyori.adventure.text.minimessage.MiniMessage mm = net.kyori.adventure.text.minimessage.MiniMessage.miniMessage(); - sender.sendMessage(mm.deserialize("Purpur has removed timings to save your performance. Please use /spark instead")); - sender.sendMessage(mm.deserialize("For more information, view its documentation at")); - sender.sendMessage(mm.deserialize("https://spark.lucko.me/docs/Command-Usage")); - return true; - } - if (args.length < 1) { - sender.sendMessage(text("Usage: " + this.usageMessage, NamedTextColor.RED)); - return true; - } - final String arg = args[0]; - if ("on".equalsIgnoreCase(arg)) { - Timings.setTimingsEnabled(true); - sender.sendMessage(text("Enabled Timings & Reset")); - return true; - } else if ("off".equalsIgnoreCase(arg)) { - Timings.setTimingsEnabled(false); - sender.sendMessage(text("Disabled Timings")); - return true; - } - - if (!Timings.isTimingsEnabled()) { - sender.sendMessage(text("Please enable timings by typing /timings on")); - return true; - } - - long now = System.currentTimeMillis(); - if ("verbon".equalsIgnoreCase(arg)) { - Timings.setVerboseTimingsEnabled(true); - sender.sendMessage(text("Enabled Verbose Timings")); - return true; - } else if ("verboff".equalsIgnoreCase(arg)) { - Timings.setVerboseTimingsEnabled(false); - sender.sendMessage(text("Disabled Verbose Timings")); - return true; - } else if ("reset".equalsIgnoreCase(arg)) { - if (now - lastResetAttempt < 30000) { - TimingsManager.reset(); - sender.sendMessage(text("Timings reset. Please wait 5-10 minutes before using /timings report.", NamedTextColor.RED)); - } else { - lastResetAttempt = now; - sender.sendMessage(text("WARNING: Timings v2 should not be reset. If you are experiencing lag, please wait 3 minutes and then issue a report. The best timings will include 10+ minutes, with data before and after your lag period. If you really want to reset, run this command again within 30 seconds.", NamedTextColor.RED)); - } - } else if ( - "paste".equalsIgnoreCase(arg) || - "report".equalsIgnoreCase(arg) || - "get".equalsIgnoreCase(arg) || - "merged".equalsIgnoreCase(arg) || - "separate".equalsIgnoreCase(arg) - ) { - Timings.generateReport(sender); - } else { - sender.sendMessage(text("Usage: " + this.usageMessage, NamedTextColor.RED)); - } + // Thunderbolt start - Remove remaining timings implementations + net.kyori.adventure.text.minimessage.MiniMessage mm = net.kyori.adventure.text.minimessage.MiniMessage.miniMessage(); + sender.sendMessage(mm.deserialize("Purpur has removed timings to save your performance. Please use /spark instead")); + sender.sendMessage(mm.deserialize("For more information, view its documentation at")); + sender.sendMessage(mm.deserialize("https://spark.lucko.me/docs/Command-Usage")); + // Thunderbolt end - Remove remaining timings implementations return true; } @@ -119,9 +70,9 @@ public class TimingsCommand extends BukkitCommand { Preconditions.checkNotNull(args, "Arguments cannot be null"); Preconditions.checkNotNull(alias, "Alias cannot be null"); - if (false && args.length == 1) { // Purpur + if (args.length == 1) { // Purpur // Thunderbolt return StringUtil.copyPartialMatches(args[0], TIMINGS_SUBCOMMANDS, - new ArrayList(TIMINGS_SUBCOMMANDS.size())); + new ArrayList<>(TIMINGS_SUBCOMMANDS.size())); // Thunderbolt } return ImmutableList.of(); } diff --git a/src/main/java/co/aikar/timings/TimingsManager.java b/src/main/java/co/aikar/timings/TimingsManager.java index 5e1558ca3ffeeaf2645fa003965474a442d650bf..9d6038dbaa13c5bfa3e0cea8f62544b97b7541d1 100644 --- a/src/main/java/co/aikar/timings/TimingsManager.java +++ b/src/main/java/co/aikar/timings/TimingsManager.java @@ -1,192 +1,4 @@ -/* - * This file is licensed under the MIT License (MIT). - * - * Copyright (c) 2014 Daniel Ennis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ package co.aikar.timings; -import co.aikar.util.LoadingMap; -import com.google.common.collect.EvictingQueue; -import org.bukkit.Bukkit; -import org.bukkit.Server; -import org.bukkit.command.Command; -import org.bukkit.plugin.Plugin; -import org.bukkit.plugin.java.PluginClassLoader; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.logging.Level; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -/** - * @deprecated Timings will likely be replaced with Spark in the future - */ @Deprecated(forRemoval = true) -public final class TimingsManager { - static final Map TIMING_MAP = LoadingMap.of( - new ConcurrentHashMap<>(4096, .5F), TimingHandler::new - ); - public static final FullServerTickHandler FULL_SERVER_TICK = new FullServerTickHandler(); - public static final TimingHandler TIMINGS_TICK = Timings.ofSafe("Timings Tick", FULL_SERVER_TICK); - public static final Timing PLUGIN_GROUP_HANDLER = Timings.ofSafe("Plugins"); - public static String url = "https://timings.aikar.co/"; - public static List hiddenConfigs = new ArrayList(); - public static boolean privacy = false; - - static final List HANDLERS = new ArrayList<>(1024); - static final List MINUTE_REPORTS = new ArrayList<>(64); - - static EvictingQueue HISTORY = EvictingQueue.create(12); - static long timingStart = 0; - static long historyStart = 0; - static boolean needsFullReset = false; - static boolean needsRecheckEnabled = false; - - private TimingsManager() {} - - /** - * Resets all timing data on the next tick - */ - static void reset() { - needsFullReset = true; - } - - /** - * Ticked every tick by CraftBukkit to count the number of times a timer - * caused TPS loss. - */ - static void tick() { - if (Timings.timingsEnabled) { - boolean violated = FULL_SERVER_TICK.isViolated(); - - for (TimingHandler handler : HANDLERS) { - if (handler.isSpecial()) { - // We manually call this - continue; - } - handler.processTick(violated); - } - - TimingHistory.playerTicks += Bukkit.getOnlinePlayers().size(); - TimingHistory.timedTicks++; - // Generate TPS/Ping/Tick reports every minute - } - } - static void stopServer() { - Timings.timingsEnabled = false; - recheckEnabled(); - } - static void recheckEnabled() { - synchronized (TIMING_MAP) { - for (TimingHandler timings : TIMING_MAP.values()) { - timings.checkEnabled(); - } - } - needsRecheckEnabled = false; - } - static void resetTimings() { - if (needsFullReset) { - // Full resets need to re-check every handlers enabled state - // Timing map can be modified from async so we must sync on it. - synchronized (TIMING_MAP) { - for (TimingHandler timings : TIMING_MAP.values()) { - timings.reset(true); - } - } - Bukkit.getLogger().log(Level.INFO, "Timings Reset"); - HISTORY.clear(); - needsFullReset = false; - needsRecheckEnabled = false; - timingStart = System.currentTimeMillis(); - } else { - // Soft resets only need to act on timings that have done something - // Handlers can only be modified on main thread. - for (TimingHandler timings : HANDLERS) { - timings.reset(false); - } - } - - HANDLERS.clear(); - MINUTE_REPORTS.clear(); - - TimingHistory.resetTicks(true); - historyStart = System.currentTimeMillis(); - } - - @NotNull - static TimingHandler getHandler(@Nullable String group, @NotNull String name, @Nullable Timing parent) { - return TIMING_MAP.get(new TimingIdentifier(group, name, parent)); - } - - - /** - *

Due to access restrictions, we need a helper method to get a Command TimingHandler with String group

- * - * Plugins should never call this - * - * @param pluginName Plugin this command is associated with - * @param command Command to get timings for - * @return TimingHandler - */ - @NotNull - public static Timing getCommandTiming(@Nullable String pluginName, @NotNull Command command) { - Plugin plugin = null; - final Server server = Bukkit.getServer(); - if (!( server == null || pluginName == null || - "minecraft".equals(pluginName) || "bukkit".equals(pluginName) || - "spigot".equalsIgnoreCase(pluginName) || "paper".equals(pluginName) - )) { - plugin = server.getPluginManager().getPlugin(pluginName); - } - if (plugin == null) { - // Plugin is passing custom fallback prefix, try to look up by class loader - plugin = getPluginByClassloader(command.getClass()); - } - if (plugin == null) { - return Timings.ofSafe("Command: " + pluginName + ":" + command.getTimingName()); - } - - return Timings.ofSafe(plugin, "Command: " + pluginName + ":" + command.getTimingName()); - } - - /** - * Looks up the class loader for the specified class, and if it is a PluginClassLoader, return the - * Plugin that created this class. - * - * @param clazz Class to check - * @return Plugin if created by a plugin - */ - @Nullable - public static Plugin getPluginByClassloader(@Nullable Class clazz) { - if (clazz == null) { - return null; - } - final ClassLoader classLoader = clazz.getClassLoader(); - if (classLoader instanceof PluginClassLoader) { - PluginClassLoader pluginClassLoader = (PluginClassLoader) classLoader; - return pluginClassLoader.getPlugin(); - } - return null; - } -} +interface TimingsManager {} // Thunderbolt - Remove remaining timings implementations diff --git a/src/main/java/co/aikar/timings/TimingsReportListener.java b/src/main/java/co/aikar/timings/TimingsReportListener.java index 3af5b8ea795311582044c712de50d29412024b77..6c3c30f98a38b5f04118060b695ae3458607a226 100644 --- a/src/main/java/co/aikar/timings/TimingsReportListener.java +++ b/src/main/java/co/aikar/timings/TimingsReportListener.java @@ -1,87 +1,4 @@ package co.aikar.timings; -import com.google.common.base.Preconditions; -import com.google.common.collect.Lists; -import org.bukkit.Bukkit; -import org.bukkit.command.CommandSender; -import org.bukkit.command.ConsoleCommandSender; -import org.bukkit.command.MessageCommandSender; -import org.bukkit.command.RemoteConsoleCommandSender; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.List; - @Deprecated(forRemoval = true) -@SuppressWarnings("WeakerAccess") -public class TimingsReportListener implements net.kyori.adventure.audience.ForwardingAudience, MessageCommandSender { - private final List senders; - private final Runnable onDone; - private String timingsURL; - - public TimingsReportListener(@NotNull CommandSender senders) { - this(senders, null); - } - public TimingsReportListener(@NotNull CommandSender sender, @Nullable Runnable onDone) { - this(Lists.newArrayList(sender), onDone); - } - public TimingsReportListener(@NotNull List senders) { - this(senders, null); - } - public TimingsReportListener(@NotNull List senders, @Nullable Runnable onDone) { - Preconditions.checkNotNull(senders); - Preconditions.checkArgument(!senders.isEmpty(), "senders is empty"); - - this.senders = Lists.newArrayList(senders); - this.onDone = onDone; - } - - @Nullable - public String getTimingsURL() { - return timingsURL; - } - - public void done() { - done(null); - } - - public void done(@Nullable String url) { - this.timingsURL = url; - if (onDone != null) { - onDone.run(); - } - for (CommandSender sender : senders) { - if (sender instanceof TimingsReportListener) { - ((TimingsReportListener) sender).done(); - } - } - } - - @Override - public void sendMessage(final @NotNull net.kyori.adventure.identity.Identity source, final @NotNull net.kyori.adventure.text.Component message, final @NotNull net.kyori.adventure.audience.MessageType type) { - net.kyori.adventure.audience.ForwardingAudience.super.sendMessage(source, message, type); - } - - @NotNull - @Override - public Iterable audiences() { - return this.senders; - } - - @Override - public void sendMessage(@NotNull String message) { - senders.forEach((sender) -> sender.sendMessage(message)); - } - - public void addConsoleIfNeeded() { - boolean hasConsole = false; - for (CommandSender sender : this.senders) { - if (sender instanceof ConsoleCommandSender || sender instanceof RemoteConsoleCommandSender) { - hasConsole = true; - } - } - if (!hasConsole) { - this.senders.add(Bukkit.getConsoleSender()); - } - } -} +interface TimingsReportListener {} // Thunderbolt - Remove remaining timings implementations diff --git a/src/main/java/co/aikar/timings/UnsafeTimingHandler.java b/src/main/java/co/aikar/timings/UnsafeTimingHandler.java index 632c4961515f5052551f841cfa840e60bba7a257..44df4bbde43d23027bf5d637aa933dcad7edc26a 100644 --- a/src/main/java/co/aikar/timings/UnsafeTimingHandler.java +++ b/src/main/java/co/aikar/timings/UnsafeTimingHandler.java @@ -1,53 +1,4 @@ -/* - * This file is licensed under the MIT License (MIT). - * - * Copyright (c) 2014 Daniel Ennis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ package co.aikar.timings; -import org.bukkit.Bukkit; -import org.jetbrains.annotations.NotNull; - -class UnsafeTimingHandler extends TimingHandler { - - UnsafeTimingHandler(@NotNull TimingIdentifier id) { - super(id); - } - - private static void checkThread() { - if (!Bukkit.isPrimaryThread()) { - throw new IllegalStateException("Calling Timings from Async Operation"); - } - } - - @NotNull - @Override - public Timing startTiming() { - checkThread(); - return super.startTiming(); - } - - @Override - public void stopTiming() { - checkThread(); - super.stopTiming(); - } -} +@Deprecated(forRemoval = true) +interface UnsafeTimingHandler {} // Thunderbolt - Remove remaining timings implementations diff --git a/src/main/java/org/bukkit/UnsafeValues.java b/src/main/java/org/bukkit/UnsafeValues.java index 0e9ccfee7a03d341e7c4d271f53b4ed168b404ef..d133ddba0355835412dd16d2bf1a8b4b4ed00545 100644 --- a/src/main/java/org/bukkit/UnsafeValues.java +++ b/src/main/java/org/bukkit/UnsafeValues.java @@ -40,7 +40,7 @@ public interface UnsafeValues { net.kyori.adventure.text.Component resolveWithContext(net.kyori.adventure.text.Component component, org.bukkit.command.CommandSender context, org.bukkit.entity.Entity scoreboardSubject, boolean bypassPermissions) throws java.io.IOException; // Paper end - void reportTimings(); // Paper + // void reportTimings(); // Paper // Thunderbolt - Remove remaining timings implementations Material toLegacy(Material material); Material fromLegacy(Material material); @@ -154,7 +154,7 @@ public interface UnsafeValues { * Server name to report to timings v2 * @return name */ - String getTimingsServerName(); + // String getTimingsServerName(); // Thunderbolt - Remove remaining timings implementations /** * Called once by the version command on first use, then cached. diff --git a/src/main/java/org/bukkit/command/FormattedCommandAlias.java b/src/main/java/org/bukkit/command/FormattedCommandAlias.java index abe256e1e45ce28036da4aa1586715bc8a1a3414..cf055d721c4c66eba9479ad88f3b6a514bf9677d 100644 --- a/src/main/java/org/bukkit/command/FormattedCommandAlias.java +++ b/src/main/java/org/bukkit/command/FormattedCommandAlias.java @@ -12,7 +12,7 @@ public class FormattedCommandAlias extends Command { public FormattedCommandAlias(@NotNull String alias, @NotNull String[] formatStrings) { super(alias); - timings = co.aikar.timings.TimingsManager.getCommandTiming("minecraft", this); // Spigot + // timings = co.aikar.timings.TimingsManager.getCommandTiming("minecraft", this); // Spigot // Thunderbolt - Remove remaining timings implementations this.formatStrings = formatStrings; } diff --git a/src/main/java/org/bukkit/command/SimpleCommandMap.java b/src/main/java/org/bukkit/command/SimpleCommandMap.java index fdedac32544be6534288c8ba28abe7f5c4c56f3b..2e40b577333e251c90871ee4b534e85f6b226c73 100644 --- a/src/main/java/org/bukkit/command/SimpleCommandMap.java +++ b/src/main/java/org/bukkit/command/SimpleCommandMap.java @@ -70,7 +70,7 @@ public class SimpleCommandMap implements CommandMap { */ @Override public boolean register(@NotNull String label, @NotNull String fallbackPrefix, @NotNull Command command) { - command.timings = co.aikar.timings.TimingsManager.getCommandTiming(fallbackPrefix, command); // Paper + // command.timings = co.aikar.timings.TimingsManager.getCommandTiming(fallbackPrefix, command); // Paper // Thunderbolt - Remove remaining timings implementations label = label.toLowerCase(java.util.Locale.ENGLISH).trim(); fallbackPrefix = fallbackPrefix.toLowerCase(java.util.Locale.ENGLISH).trim(); boolean registered = register(label, command, false, fallbackPrefix); @@ -165,11 +165,13 @@ public class SimpleCommandMap implements CommandMap { parsedArgs = event.getArgs(); // Purpur end + /* // Thunderbolt - Remove remaining timings implementations // Paper start - Plugins do weird things to workaround normal registration if (target.timings == null) { target.timings = co.aikar.timings.TimingsManager.getCommandTiming(null, target); } // Paper end + */ // Thunderbolt - Remove remaining timings implementations try { //try (co.aikar.timings.Timing ignored = target.timings.startTiming()) { // Paper - use try with resources // Purpur diff --git a/src/main/java/org/bukkit/plugin/SimplePluginManager.java b/src/main/java/org/bukkit/plugin/SimplePluginManager.java index 5dc64d8c9aeae612fd31af0673f3530a9e777dfc..62242daa0bd7851479748cd62627f51cfe6bc6f1 100644 --- a/src/main/java/org/bukkit/plugin/SimplePluginManager.java +++ b/src/main/java/org/bukkit/plugin/SimplePluginManager.java @@ -60,7 +60,7 @@ public final class SimplePluginManager implements PluginManager { public final Map> defSubs = new HashMap>(); public PluginManager paperPluginManager; // Paper end - private boolean useTimings = false; + // private boolean useTimings = false; // Thunderbolt - Remove remaining timings implementations public SimplePluginManager(@NotNull Server instance, @NotNull SimpleCommandMap commandMap) { server = instance; @@ -723,7 +723,7 @@ public final class SimplePluginManager implements PluginManager { throw new IllegalPluginAccessException("Plugin attempted to register " + event + " while not enabled"); } - executor = new co.aikar.timings.TimedEventExecutor(executor, plugin, null, event); // Paper + // executor = new co.aikar.timings.TimedEventExecutor(executor, plugin, null, event); // Paper // Thunderbolt - Remove remaining timings implementations if (false) { // Spigot - RL handles useTimings check now // Paper getEventListeners(event).register(new TimedRegisteredListener(listener, executor, priority, plugin, ignoreCancelled)); } else { @@ -958,8 +958,9 @@ public final class SimplePluginManager implements PluginManager { @Override public boolean useTimings() { - if (true) {return this.paperPluginManager.useTimings();} // Paper - return co.aikar.timings.Timings.isTimingsEnabled(); // Spigot + // if (true) {return this.paperPluginManager.useTimings();} // Paper + // return co.aikar.timings.Timings.isTimingsEnabled(); // Spigot + return false; // Thunderbolt - Remove remaining timings implementations } /** @@ -968,7 +969,8 @@ public final class SimplePluginManager implements PluginManager { * @param use True if per event timing code should be used */ public void useTimings(boolean use) { - co.aikar.timings.Timings.setTimingsEnabled(use); // Paper + // co.aikar.timings.Timings.setTimingsEnabled(use); // Paper // Thunderbolt - Remove remaining timings implementations + throw new org.plazmamc.thunderbolt.DeprecatedException("Timings is deprecated and will be removed in the future. Use Spark instead."); // Thunderbolt - Remove remaining timings implementations // Thunderbolt - Remove remaining timings implementations } // Paper start diff --git a/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java b/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java index 0c6ca7588fb3d6b6497ddf032fe75e5c6c9719e5..e413370a3e1634483f75464cae7e81e1d03f665e 100644 --- a/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java +++ b/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java @@ -43,7 +43,7 @@ import org.bukkit.plugin.TimedRegisteredListener; import org.bukkit.plugin.UnknownDependencyException; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.spigotmc.CustomTimingsHandler; // Spigot +// import org.spigotmc.CustomTimingsHandler; // Spigot // Thunderbolt - Remove remaining timings implementations import org.yaml.snakeyaml.error.YAMLException; /** @@ -294,21 +294,21 @@ public final class JavaPluginLoader implements PluginLoader { } } - EventExecutor executor = new co.aikar.timings.TimedEventExecutor(new EventExecutor() { // Paper - @Override - public void execute(@NotNull Listener listener, @NotNull Event event) throws EventException { // Paper - try { - if (!eventClass.isAssignableFrom(event.getClass())) { - return; - } - method.invoke(listener, event); - } catch (InvocationTargetException ex) { - throw new EventException(ex.getCause()); - } catch (Throwable t) { - throw new EventException(t); + // Thunderbolt start - Remove remaining timings implementations + // Paper + EventExecutor executor = (listener1, event) -> { // Paper + try { + if (!eventClass.isAssignableFrom(event.getClass())) { + return; } + method.invoke(listener1, event); + } catch (InvocationTargetException ex) { + throw new EventException(ex.getCause()); + } catch (Throwable t) { + throw new EventException(t); } - }, plugin, method, eventClass); // Paper + }; // Paper + // Thunderbolt end - Remove remaining timings implementations if (false) { // Spigot - RL handles useTimings check now eventSet.add(new TimedRegisteredListener(listener, executor, eh.priority(), plugin, eh.ignoreCancelled())); } else { diff --git a/src/main/java/org/plazmamc/thunderbolt/DeprecatedException.java b/src/main/java/org/plazmamc/thunderbolt/DeprecatedException.java new file mode 100644 index 0000000000000000000000000000000000000000..d7c6e3b39b3a9977b07b9761c3d884ff68d56ee9 --- /dev/null +++ b/src/main/java/org/plazmamc/thunderbolt/DeprecatedException.java @@ -0,0 +1,7 @@ +package org.plazmamc.thunderbolt; + +public class DeprecatedException extends RuntimeException { + public DeprecatedException(String message) { + super(message); + } +} diff --git a/src/main/java/org/spigotmc/CustomTimingsHandler.java b/src/main/java/org/spigotmc/CustomTimingsHandler.java index 9c2d605c50cbf9aefa56ec209df9f6cea1392e89..ba99e25371031042b14fc483aab2697e17fb79b7 100644 --- a/src/main/java/org/spigotmc/CustomTimingsHandler.java +++ b/src/main/java/org/spigotmc/CustomTimingsHandler.java @@ -26,9 +26,9 @@ package org.spigotmc; import org.bukkit.Bukkit; import org.jetbrains.annotations.NotNull; import org.bukkit.plugin.AuthorNagException; -import co.aikar.timings.Timing; -import co.aikar.timings.Timings; -import co.aikar.timings.TimingsManager; +// import co.aikar.timings.Timing; // Thunderbolt - Remove remaining timings implementations +// import co.aikar.timings.Timings; // Thunderbolt - Remove remaining timings implementations +// import co.aikar.timings.TimingsManager; // Thunderbolt - Remove remaining timings implementations import java.lang.reflect.Method; import java.util.logging.Level; @@ -43,9 +43,10 @@ import java.util.logging.Level; */ @Deprecated(forRemoval = true) public final class CustomTimingsHandler { - private final Timing handler; + // private final Timing handler; // Thunderbolt - Remove remaining timings implementations public CustomTimingsHandler(@NotNull String name) { + throw new org.plazmamc.thunderbolt.DeprecatedException("Timings is deprecated and will be removed in the future. Use Spark instead."); /* // Thunderbolt - Remove remaining timings implementations /* Timing timing; new AuthorNagException("Deprecated use of CustomTimingsHandler. Please Switch to Timings.of ASAP").printStackTrace(); @@ -59,9 +60,19 @@ public final class CustomTimingsHandler { timing = Timings.NULL_HANDLER; } handler = timing; + */ // Thunderbolt - Remove remaining timings implementations } - public void startTiming() { /*handler.startTiming();*/ } // Purpur - public void stopTiming() { /*handler.stopTiming();*/ } // Purpur + // Thunderbolt start - Remove remaining timings implementations + public void startTiming() { + /*handler.startTiming();*/ // Purpur + throw new org.plazmamc.thunderbolt.DeprecatedException("Timings is deprecated and will be removed in the future. Use Spark instead."); // Thunderbolt - Remove remaining timings implementations + } + + public void stopTiming() { + /*handler.stopTiming();*/ // Purpur + throw new org.plazmamc.thunderbolt.DeprecatedException("Timings is deprecated and will be removed in the future. Use Spark instead."); // Thunderbolt - Remove remaining timings implementations + } + // Thunderbolt end - Remove remaining timings implementations }