Try optimizing the task dispatching
This commit is contained in:
111
patches/server/0019-Try-optimizing-the-task-dispatching.patch
Normal file
111
patches/server/0019-Try-optimizing-the-task-dispatching.patch
Normal file
@@ -0,0 +1,111 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: MrHua269 <wangxyper@163.com>
|
||||||
|
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<R extends ThreadedRegionizer.ThreadedRegio
|
||||||
|
private static final AtomicLong REGION_ID_GENERATOR = new AtomicLong();
|
||||||
|
|
||||||
|
private static final int STATE_TRANSIENT = 0;
|
||||||
|
- private static final int STATE_READY = 1;
|
||||||
|
+ public static final int STATE_READY = 1; // Luminol - Optimize task dispatching
|
||||||
|
private static final int STATE_TICKING = 2;
|
||||||
|
private static final int STATE_DEAD = 3;
|
||||||
|
|
||||||
|
public final long id;
|
||||||
|
|
||||||
|
- private int state;
|
||||||
|
+ public int state; // Luminol - Optimize task dispatching
|
||||||
|
|
||||||
|
private final Long2ReferenceOpenHashMap<ThreadedRegionSection<R, S>> sectionByKey = new Long2ReferenceOpenHashMap<>();
|
||||||
|
private final ReferenceOpenHashSet<ThreadedRegionSection<R, S>> 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..350eeea4f2a1d3d5eec01d795e23d88cabd0ea07 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.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
|
||||||
@@ -5,10 +5,10 @@ Subject: [PATCH] Threaded region start tick and finished tick event
|
|||||||
|
|
||||||
|
|
||||||
diff --git a/src/main/java/io/papermc/paper/threadedregions/TickRegionScheduler.java b/src/main/java/io/papermc/paper/threadedregions/TickRegionScheduler.java
|
diff --git a/src/main/java/io/papermc/paper/threadedregions/TickRegionScheduler.java b/src/main/java/io/papermc/paper/threadedregions/TickRegionScheduler.java
|
||||||
index c43b263e6502ba48a876803385f8d05c5e84ba3e..9b1a2dd2538652298571c2abc3d9afb144fddd95 100644
|
index 350eeea4f2a1d3d5eec01d795e23d88cabd0ea07..3588e9052afe8c3b8dc0872a73acb736062d3a2f 100644
|
||||||
--- a/src/main/java/io/papermc/paper/threadedregions/TickRegionScheduler.java
|
--- a/src/main/java/io/papermc/paper/threadedregions/TickRegionScheduler.java
|
||||||
+++ b/src/main/java/io/papermc/paper/threadedregions/TickRegionScheduler.java
|
+++ b/src/main/java/io/papermc/paper/threadedregions/TickRegionScheduler.java
|
||||||
@@ -394,7 +394,7 @@ public final class TickRegionScheduler {
|
@@ -442,7 +442,7 @@ public final class TickRegionScheduler {
|
||||||
|
|
||||||
final long scheduledStart = this.getScheduledStart();
|
final long scheduledStart = this.getScheduledStart();
|
||||||
final long scheduledEnd = scheduledStart + TIME_BETWEEN_TICKS;
|
final long scheduledEnd = scheduledStart + TIME_BETWEEN_TICKS;
|
||||||
@@ -17,7 +17,7 @@ index c43b263e6502ba48a876803385f8d05c5e84ba3e..9b1a2dd2538652298571c2abc3d9afb1
|
|||||||
synchronized (this) {
|
synchronized (this) {
|
||||||
this.currentTickData = new TickTime(
|
this.currentTickData = new TickTime(
|
||||||
lastTickStart, scheduledStart, tickStart, cpuStart,
|
lastTickStart, scheduledStart, tickStart, cpuStart,
|
||||||
@@ -429,6 +429,7 @@ public final class TickRegionScheduler {
|
@@ -477,6 +477,7 @@ public final class TickRegionScheduler {
|
||||||
);
|
);
|
||||||
|
|
||||||
this.addTickTime(time);
|
this.addTickTime(time);
|
||||||
Reference in New Issue
Block a user