Files
LuminolMC/patches/server/0023-Try-optimizing-the-task-dispatching.patch
2024-12-31 21:24:17 +08:00

124 lines
5.3 KiB
Diff

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..81db3c6f330729cb353b198badc86fe29e76bafc 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 (!me.earthme.luminol.config.modules.experiment.ExtraOptimizationConfig.enabled || !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..7f8473a6db78dc652e0ccfdb7cc038126f1e61ea 100644
--- a/src/main/java/io/papermc/paper/threadedregions/ThreadedRegionizer.java
+++ b/src/main/java/io/papermc/paper/threadedregions/ThreadedRegionizer.java
@@ -682,7 +682,7 @@ public final class ThreadedRegionizer<R extends ThreadedRegionizer.ThreadedRegio
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 056fb1ca7b07d5e713dcbd951830b14fc9025f4c..4bfa83a6683970657eaaaaa265855f0d2e79a3a9 100644
--- a/src/main/java/io/papermc/paper/threadedregions/TickRegionScheduler.java
+++ b/src/main/java/io/papermc/paper/threadedregions/TickRegionScheduler.java
@@ -364,6 +364,47 @@ public final class TickRegionScheduler {
return !this.markNotTicking() || this.cancelled.get() ? null : Boolean.valueOf(ret);
}
+ @Override
+ public boolean flushExtraTask(){
+ if (this.cancelled.get()) {
+ return false;
+ }
+
+ if (!this.tryMarkTicking()) {
+ 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
diff --git a/src/main/java/me/earthme/luminol/config/modules/experiment/ExtraOptimizationConfig.java b/src/main/java/me/earthme/luminol/config/modules/experiment/ExtraOptimizationConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..d908123da05c620586a1defcead423cc519113e9
--- /dev/null
+++ b/src/main/java/me/earthme/luminol/config/modules/experiment/ExtraOptimizationConfig.java
@@ -0,0 +1,20 @@
+package me.earthme.luminol.config.modules.experiment;
+
+import me.earthme.luminol.config.ConfigInfo;
+import me.earthme.luminol.config.EnumConfigCategory;
+import me.earthme.luminol.config.IConfigModule;
+
+public class ExtraOptimizationConfig implements IConfigModule {
+ @ConfigInfo(baseName = "enabled")
+ public static boolean enabled = false;
+
+ @Override
+ public EnumConfigCategory getCategory() {
+ return EnumConfigCategory.EXPERIMENT;
+ }
+
+ @Override
+ public String getBaseName() {
+ return "run_extra_tasks_during_waiting";
+ }
+}