From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: MrHua269 Date: Fri, 2 Aug 2024 22:22:18 +0800 Subject: [PATCH] Try optimizing the task dispatching diff --git a/src/main/java/ca/spottedleaf/concurrentutil/scheduler/SchedulerThreadPool.java b/src/main/java/ca/spottedleaf/concurrentutil/scheduler/SchedulerThreadPool.java index 8197ccb1c4e5878dbd8007b5fb514640765ec8e4..6a17cb6037bd15b367319bb0accb71813f078087 100644 --- a/src/main/java/ca/spottedleaf/concurrentutil/scheduler/SchedulerThreadPool.java +++ b/src/main/java/ca/spottedleaf/concurrentutil/scheduler/SchedulerThreadPool.java @@ -366,6 +366,12 @@ public class SchedulerThreadPool { "scheduled_state=" + this.scheduled.get() + "," + "}"; } + + // Luminol start + protected boolean flushExtraTask(){ + return false; + } + // Luminol end } private static final class TickThreadRunner implements Runnable { @@ -526,7 +532,7 @@ public class SchedulerThreadPool { if (diff <= 0L) { break; } - LockSupport.parkNanos(startState, diff); + if (!startStateTask.flushExtraTask()) LockSupport.parkNanos(startState, 1_000); // Luminol - Optimize task dispatching if (this.scheduler.halted) { return; } diff --git a/src/main/java/io/papermc/paper/threadedregions/ThreadedRegionizer.java b/src/main/java/io/papermc/paper/threadedregions/ThreadedRegionizer.java index ce388e0ef231d7d73f75f5778c58eb40f6402f0f..bba0d3b572cf9aa7c03816c0a74b7579b2280210 100644 --- a/src/main/java/io/papermc/paper/threadedregions/ThreadedRegionizer.java +++ b/src/main/java/io/papermc/paper/threadedregions/ThreadedRegionizer.java @@ -676,13 +676,13 @@ public final class ThreadedRegionizer> sectionByKey = new Long2ReferenceOpenHashMap<>(); private final ReferenceOpenHashSet> deadSections = new ReferenceOpenHashSet<>(); diff --git a/src/main/java/io/papermc/paper/threadedregions/TickRegionScheduler.java b/src/main/java/io/papermc/paper/threadedregions/TickRegionScheduler.java index c43b263e6502ba48a876803385f8d05c5e84ba3e..0197be1de64afbcda4897a8613e999239b90133a 100644 --- a/src/main/java/io/papermc/paper/threadedregions/TickRegionScheduler.java +++ b/src/main/java/io/papermc/paper/threadedregions/TickRegionScheduler.java @@ -357,6 +357,54 @@ public final class TickRegionScheduler { return !this.markNotTicking() || this.cancelled.get() ? null : Boolean.valueOf(ret); } + @Override + public boolean flushExtraTask(){ + if (this.region != null && this.region.region.state != ThreadedRegionizer.ThreadedRegion.STATE_READY){ + return false; + } + + if (this.cancelled.get()) { + return false; + } + + if (!this.tryMarkTicking()) { + if (!this.cancelled.get()) { + throw new IllegalStateException("Scheduled region should be acquirable"); + } + return false; + } + + if (this.cancelled.get()) { + this.markNotTicking(); + return false; + } + + if (this.region != null) { + TickRegionScheduler.setTickingRegion(this.region.region); + } + + try { + if (this.region == null){ + return false; + } + + if (this.region.region.getData().getTaskQueueData().executeChunkTask()){ + return true; + } + + if (this.region.region.getData().getTaskQueueData().executeTickTask()){ + return true; + } + }finally { + this.markNotTicking(); + if (this.region != null) { + TickRegionScheduler.setTickingRegion(null); + } + } + + return false; + } + @Override public final boolean runTick() { // Remember, we are supposed use setScheduledStart if we return true here, otherwise