From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: NanaChiyo0721 Date: Sun, 16 Aug 2026 01:31:31 +0800 Subject: [PATCH] Per region async profiler diff --git a/io/papermc/paper/threadedregions/TickRegionScheduler.java b/io/papermc/paper/threadedregions/TickRegionScheduler.java index 724332d074bd7d3dfdcb60e83cf1fd6ce706000e..eb65077d18d86fce3ae1131445ebdcb736f5dc93 100644 --- a/io/papermc/paper/threadedregions/TickRegionScheduler.java +++ b/io/papermc/paper/threadedregions/TickRegionScheduler.java @@ -220,6 +220,7 @@ public final class TickRegionScheduler { */ public void scheduleRegion(final RegionScheduleHandle region) { region.scheduler = this; + region.scheduleProfiler = TickRegions.getScheduleProfilerManager().register(region.id); // Shiroha - per region async profiler this.scheduler.schedule(region); } @@ -230,6 +231,7 @@ public final class TickRegionScheduler { public void descheduleRegion(final RegionScheduleHandle region) { // To avoid acquiring any of the locks the scheduler may be using, we // simply cancel the next action. + TickRegions.getScheduleProfilerManager().deRegister(region.id); region.scheduleProfiler = null; // Shiroha - per region async profiler region.markNonSchedulable(); } @@ -296,6 +298,7 @@ public final class TickRegionScheduler { } public static abstract class RegionScheduleHandle extends SchedulableTick { + public io.nanachiyo0721.shiroha.utils.profiling.RegionScheduleProfiler scheduleProfiler = null; // Shiroha - per region async profiler protected long currentTick; protected long lastTickStart; @@ -391,6 +394,7 @@ public final class TickRegionScheduler { final FoliaWatchdogThread.RunningTick runningTick = new FoliaWatchdogThread.RunningTick(tickStart, this, Thread.currentThread()); // Folia - watchdog WATCHDOG_THREAD.addTick(runningTick); // Folia - watchdog + if (this.scheduleProfiler != null) this.scheduleProfiler.taskBegin(); // Shiroha - per region async profiler try { this.runRegionTasks(() -> { return !RegionScheduleHandle.this.cancelled.get() && canContinue.getAsBoolean(); @@ -400,6 +404,7 @@ public final class TickRegionScheduler { // don't release region for another tick return false; } finally { + if (this.scheduleProfiler != null) this.scheduleProfiler.taskEnd(); // Shiroha - per region async profiler WATCHDOG_THREAD.removeTick(runningTick); // Folia - watchdog final long tickEnd = System.nanoTime(); final long cpuEnd = MEASURE_CPU_TIME ? THREAD_MX_BEAN.getCurrentThreadCpuTime() : 0L; @@ -476,6 +481,7 @@ public final class TickRegionScheduler { final FoliaWatchdogThread.RunningTick runningTick = new FoliaWatchdogThread.RunningTick(tickStart, this, Thread.currentThread()); // Folia - region threading WATCHDOG_THREAD.addTick(runningTick); // Folia - region threading + if (this.scheduleProfiler != null) this.scheduleProfiler.tickBegin(); // Shiroha - per region async profiler try { // next start isn't updated until the end of this tick this.tickRegion(tickCount, tickStart, scheduledEnd); @@ -489,6 +495,7 @@ public final class TickRegionScheduler { // regionFailed will schedule a shutdown, so we should avoid letting this region tick further return false; } finally { + if (this.scheduleProfiler != null) this.scheduleProfiler.tickEnd(); // Shiroha - per region async profiler WATCHDOG_THREAD.removeTick(runningTick); // Folia - region threading final long tickEnd = System.nanoTime(); final long cpuEnd = MEASURE_CPU_TIME ? THREAD_MX_BEAN.getCurrentThreadCpuTime() : 0L; diff --git a/io/papermc/paper/threadedregions/TickRegions.java b/io/papermc/paper/threadedregions/TickRegions.java index ca24971a1dc7576e6f216dfc0fe56d2e5195a14f..aacf39922a7e338351a7fe89956162ba736d2cc2 100644 --- a/io/papermc/paper/threadedregions/TickRegions.java +++ b/io/papermc/paper/threadedregions/TickRegions.java @@ -36,10 +36,12 @@ public final class TickRegions implements ThreadedRegionizer.RegionCallbacks