From 230ce3db5199540d85b0987717025b127db2f9cb Mon Sep 17 00:00:00 2001 From: Martijn Muijsers Date: Fri, 17 Feb 2023 17:08:55 +0100 Subject: [PATCH] Warn if virtual threads are not enabled --- ...virtual-threads-for-development-runs.patch | 4 +- patches/server/0046-SIMD-support.patch | 4 +- .../server/0144-Virtual-threads-utility.patch | 9 +- patches/server/0150-Base-thread-pool.patch | 124 +++++++++++------- ...0151-Watch-for-blocking-base-threads.patch | 4 +- ...unk-worker-tasks-on-base-thread-pool.patch | 8 +- 6 files changed, 95 insertions(+), 58 deletions(-) diff --git a/patches/server/0005-Enable-virtual-threads-for-development-runs.patch b/patches/server/0005-Enable-virtual-threads-for-development-runs.patch index bde01a0..c2d1367 100644 --- a/patches/server/0005-Enable-virtual-threads-for-development-runs.patch +++ b/patches/server/0005-Enable-virtual-threads-for-development-runs.patch @@ -7,7 +7,7 @@ License: GPL-3.0 (https://www.gnu.org/licenses/gpl-3.0.html) Gale - https://galemc.org diff --git a/build.gradle.kts b/build.gradle.kts -index 172644d99e3632a3c5f0fdb5d1d847f2796b4230..595957438cc6321d11d1178a74846397b7d30aaa 100644 +index 172644d99e3632a3c5f0fdb5d1d847f2796b4230..f3b0a2d1a8675013f3af0ed03bc6df12b2be88e2 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -182,6 +182,10 @@ fun TaskContainer.registerRunTask( @@ -16,7 +16,7 @@ index 172644d99e3632a3c5f0fdb5d1d847f2796b4230..595957438cc6321d11d1178a74846397 modifiedJvmArgs.addAll(listOf("-Xms${memoryGb}G", "-Xmx${memoryGb}G")) + // Gale start - enable virtual threads for development runs + modifiedJvmArgs.add("--enable-preview") -+ modifiedJvmArgs.addAll(listOf("--add-opens", "java.base/java.lang=ALL-UNNAMED")) ++ modifiedJvmArgs.addAll(listOf("--add-opens=java.base/java.lang=ALL-UNNAMED")) + // Gale end - enable virtual threads for development runs jvmArgs = modifiedJvmArgs diff --git a/patches/server/0046-SIMD-support.patch b/patches/server/0046-SIMD-support.patch index 55f4039..cbe20c0 100644 --- a/patches/server/0046-SIMD-support.patch +++ b/patches/server/0046-SIMD-support.patch @@ -13,7 +13,7 @@ As part of: Pufferfish (https://github.com/pufferfish-gg/Pufferfish) Licensed under: GPL-3.0 (https://www.gnu.org/licenses/gpl-3.0.html) diff --git a/build.gradle.kts b/build.gradle.kts -index 21dde8d45c98fc57b97d847908c011808d2e3b85..a82ce4dfde0a81a85def5e3e5b09ba3a15aa73bc 100644 +index b7cac76808d22a4f8e389c0f476e2825404b6e59..ef633f7d1d48f8c2447c7d191f31ec646d641dca 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -63,6 +63,7 @@ tasks.withType { @@ -26,7 +26,7 @@ index 21dde8d45c98fc57b97d847908c011808d2e3b85..a82ce4dfde0a81a85def5e3e5b09ba3a @@ -186,6 +187,7 @@ fun TaskContainer.registerRunTask( modifiedJvmArgs.add("--enable-preview") - modifiedJvmArgs.addAll(listOf("--add-opens", "java.base/java.lang=ALL-UNNAMED")) + modifiedJvmArgs.addAll(listOf("--add-opens=java.base/java.lang=ALL-UNNAMED")) // Gale end - enable virtual threads for development runs + modifiedJvmArgs.add("--add-modules=jdk.incubator.vector") // Gale - Pufferfish - SIMD support jvmArgs = modifiedJvmArgs diff --git a/patches/server/0144-Virtual-threads-utility.patch b/patches/server/0144-Virtual-threads-utility.patch index 55e589a..6955de9 100644 --- a/patches/server/0144-Virtual-threads-utility.patch +++ b/patches/server/0144-Virtual-threads-utility.patch @@ -8,10 +8,10 @@ Gale - https://galemc.org diff --git a/src/main/java/org/galemc/gale/util/VirtualThreads.java b/src/main/java/org/galemc/gale/util/VirtualThreads.java new file mode 100644 -index 0000000000000000000000000000000000000000..9f5a194ffcdce678212ccc0e800ff1fe6aa208c8 +index 0000000000000000000000000000000000000000..0ae0cde2ed65939f84d0f843e2c2b89beb76ed3f --- /dev/null +++ b/src/main/java/org/galemc/gale/util/VirtualThreads.java -@@ -0,0 +1,139 @@ +@@ -0,0 +1,144 @@ +// Gale - virtual threads utility + +package org.galemc.gale.util; @@ -36,6 +36,11 @@ index 0000000000000000000000000000000000000000..9f5a194ffcdce678212ccc0e800ff1fe + private VirtualThreads() {} + + /** ++ * The minimum major version of Java that is known to support using virtual threads. ++ */ ++ public static final int minimumJavaMajorVersion = 19; ++ ++ /** + * The {@link Thread#ofVirtual()} method, obtained via Reflection, + * or null if it could not be obtained. + */ diff --git a/patches/server/0150-Base-thread-pool.patch b/patches/server/0150-Base-thread-pool.patch index 9d7c1d0..881b07b 100644 --- a/patches/server/0150-Base-thread-pool.patch +++ b/patches/server/0150-Base-thread-pool.patch @@ -492,7 +492,7 @@ index 27d4aa45e585842c04491839826d405d6f447f0e..0a54e07db5a55b6170650c070bb19e07 engine.execute(() -> { // Paper - Fix preemptive player kick on a server shutdown. packetProcessing.push(listener); // Paper - detailed watchdog information diff --git a/src/main/java/net/minecraft/server/Main.java b/src/main/java/net/minecraft/server/Main.java -index 0c4c62674b4c7e8e3921c7eb3ef726759ac75075..40f20806cc06106b4aa8e708467dcea94d23c83e 100644 +index 0c4c62674b4c7e8e3921c7eb3ef726759ac75075..748f24b9b09e56ed3e755b06648a9f2c21b7ee06 100644 --- a/src/main/java/net/minecraft/server/Main.java +++ b/src/main/java/net/minecraft/server/Main.java @@ -1,27 +1,22 @@ @@ -526,15 +526,16 @@ index 0c4c62674b4c7e8e3921c7eb3ef726759ac75075..40f20806cc06106b4aa8e708467dcea9 import net.minecraft.SharedConstants; import net.minecraft.Util; import net.minecraft.commands.Commands; -@@ -57,6 +52,7 @@ import net.minecraft.world.level.storage.LevelStorageSource; +@@ -57,6 +52,8 @@ import net.minecraft.world.level.storage.LevelStorageSource; import net.minecraft.world.level.storage.LevelSummary; import net.minecraft.world.level.storage.PrimaryLevelData; import net.minecraft.world.level.storage.WorldData; +import org.galemc.gale.executor.queue.BaseTaskQueueTier; ++import org.galemc.gale.util.VirtualThreads; import org.slf4j.Logger; // CraftBukkit start -@@ -64,7 +60,7 @@ import com.google.common.base.Charsets; +@@ -64,7 +61,7 @@ import com.google.common.base.Charsets; import com.mojang.bridge.game.PackType; import java.io.InputStreamReader; import java.util.concurrent.atomic.AtomicReference; @@ -543,7 +544,37 @@ index 0c4c62674b4c7e8e3921c7eb3ef726759ac75075..40f20806cc06106b4aa8e708467dcea9 import org.bukkit.configuration.file.YamlConfiguration; // CraftBukkit end -@@ -228,6 +224,12 @@ public class Main { +@@ -170,6 +167,29 @@ public class Main { + } + // Paper end + ++ // Gale start - base thread pool - inform if virtual threads are not available ++ if (!VirtualThreads.areVirtualThreadsEnabled) { ++ int majorVersion; ++ try { ++ String version = System.getProperty("java.version"); ++ majorVersion = Integer.parseInt(version.substring(0, version.indexOf('.'))); ++ } catch (Throwable ignored) { ++ /* ++ If we cannot determine the major version, ++ just print a virtual thread warning instead of a version warning. ++ */ ++ majorVersion = -1; ++ } ++ if (majorVersion == -1 || majorVersion >= VirtualThreads.minimumJavaMajorVersion) { ++ Main.LOGGER.warn("Virtual threads are not enabled@"); ++ Main.LOGGER.warn("To enable additional powerful optimizations, add \"--enable-preview --add-opens=java.base/java.lang=ALL-UNNAMED\" to your startup flags, BEFORE the \"-jar\"."); ++ } else { ++ Main.LOGGER.warn("You are using Java " + majorVersion + "."); ++ Main.LOGGER.warn("It is strongly recommended to run Gale with Java " + VirtualThreads.minimumJavaMajorVersion + " or higher to enable additional powerful optimizations."); ++ } ++ } ++ // Gale end - base thread pool - inform if virtual threads are not available ++ + org.spigotmc.SpigotConfig.disabledAdvancements = spigotConfiguration.getStringList("advancements.disabled"); // Paper - fix SPIGOT-5885, must be set early in init + // Paper start - fix SPIGOT-5824 + File file; +@@ -228,6 +248,12 @@ public class Main { WorldStem worldstem; @@ -3773,7 +3804,7 @@ index 0000000000000000000000000000000000000000..a763028deff9bc131b8208886bf26513 +} diff --git a/src/main/java/org/galemc/gale/executor/queue/SimpleTaskQueue.java b/src/main/java/org/galemc/gale/executor/queue/SimpleTaskQueue.java new file mode 100644 -index 0000000000000000000000000000000000000000..2c910f89f1056d00e5e4a2d832cdd4be4b7527b4 +index 0000000000000000000000000000000000000000..fa9f7f248a46fa7a4a778e06320164df9cafe3b2 --- /dev/null +++ b/src/main/java/org/galemc/gale/executor/queue/SimpleTaskQueue.java @@ -0,0 +1,253 @@ @@ -3789,7 +3820,7 @@ index 0000000000000000000000000000000000000000..2c910f89f1056d00e5e4a2d832cdd4be +import org.galemc.gale.executor.annotation.YieldFree; +import org.galemc.gale.executor.thread.BaseThread; +import org.galemc.gale.executor.thread.pool.BaseThreadActivation; -+import org.galemc.gale.executor.thread.SignalReason; ++import org.galemc.gale.executor.thread.platform.SignalReason; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + @@ -4210,10 +4241,10 @@ index 0000000000000000000000000000000000000000..fb4f9c047fc71a9a01aa47871254c6a9 +} diff --git a/src/main/java/org/galemc/gale/executor/thread/AbstractYieldingThread.java b/src/main/java/org/galemc/gale/executor/thread/AbstractYieldingThread.java new file mode 100644 -index 0000000000000000000000000000000000000000..fd4082f1d8fe558bbaaf3b17da18b361e34c81ed +index 0000000000000000000000000000000000000000..9fa8e04e3053d832ef7817344f10eb450c538284 --- /dev/null +++ b/src/main/java/org/galemc/gale/executor/thread/AbstractYieldingThread.java -@@ -0,0 +1,147 @@ +@@ -0,0 +1,145 @@ +// Gale - base thread pool + +package org.galemc.gale.executor.thread; @@ -4221,8 +4252,6 @@ index 0000000000000000000000000000000000000000..fd4082f1d8fe558bbaaf3b17da18b361 +import net.minecraft.server.MinecraftServer; +import org.galemc.gale.concurrent.CheckableLock; +import org.galemc.gale.executor.annotation.PotentiallyYielding; -+import org.galemc.gale.executor.annotation.thread.AnyThreadSafe; -+import org.galemc.gale.executor.annotation.YieldFree; +import org.galemc.gale.executor.annotation.thread.ThisThreadOnly; +import org.galemc.gale.executor.lock.SingleWaitingBaseThreadYieldingLock; +import org.galemc.gale.executor.lock.YieldingLock; @@ -4272,7 +4301,7 @@ index 0000000000000000000000000000000000000000..fd4082f1d8fe558bbaaf3b17da18b361 + void yieldUntil(@Nullable Long timeoutTime, @Nullable BooleanSupplier stopCondition, @Nullable YieldingLock yieldingLock); + + /** -+ * Calls {@link #yieldUntil(BooleanSupplier, YieldingLock)}, but creates a {@link YieldingLock} ++ * Calls {@link #yieldUntil(Long, BooleanSupplier, YieldingLock)}, but creates a {@link YieldingLock} + * based on the given {@code future}, that causes this thread to be notified when the future is completed. + * + * @param autoCompletingLockConsumer An optional consumer that will be applied to the created {@link YieldingLock}, @@ -4447,10 +4476,10 @@ index 0000000000000000000000000000000000000000..eab769d7319f26db1f4db9599a3c263c +} diff --git a/src/main/java/org/galemc/gale/executor/thread/BaseThread.java b/src/main/java/org/galemc/gale/executor/thread/BaseThread.java new file mode 100644 -index 0000000000000000000000000000000000000000..4ec06cbff045bd42c1da5881cd0f2446cde39a7b +index 0000000000000000000000000000000000000000..cb1731f8c00f30a18aa042eaabc7f429fcaf9e2a --- /dev/null +++ b/src/main/java/org/galemc/gale/executor/thread/BaseThread.java -@@ -0,0 +1,765 @@ +@@ -0,0 +1,766 @@ +// Gale - base thread pool + +package org.galemc.gale.executor.thread; @@ -4468,6 +4497,7 @@ index 0000000000000000000000000000000000000000..4ec06cbff045bd42c1da5881cd0f2446 +import org.galemc.gale.executor.lock.YieldingLock; +import org.galemc.gale.executor.queue.AbstractTaskQueue; +import org.galemc.gale.executor.queue.BaseTaskQueueTier; ++import org.galemc.gale.executor.thread.platform.SignalReason; +import org.galemc.gale.executor.thread.pool.*; +import org.jetbrains.annotations.Nullable; + @@ -5299,47 +5329,19 @@ index 0000000000000000000000000000000000000000..7d58d995d8e74cd5f51f85f123166bf8 + } + +} -diff --git a/src/main/java/org/galemc/gale/executor/thread/SignalReason.java b/src/main/java/org/galemc/gale/executor/thread/SignalReason.java -new file mode 100644 -index 0000000000000000000000000000000000000000..436b0a8249290d833472da58ec01f9690be2fb95 ---- /dev/null -+++ b/src/main/java/org/galemc/gale/executor/thread/SignalReason.java -@@ -0,0 +1,23 @@ -+// Gale - base thread pool -+ -+package org.galemc.gale.executor.thread; -+ -+import org.galemc.gale.executor.lock.YieldingLock; -+ -+/** -+ * A reason of a call to {@link SignallableThread#signal}. -+ * -+ * @author Martijn Muijsers under AGPL-3.0 -+ */ -+public enum SignalReason { -+ -+ /** -+ * A task that the signalled thread could poll and start is available. -+ */ -+ TASK, -+ /** -+ * The {@link YieldingLock} that the signalled thread was waiting for was released. -+ */ -+ YIELDING_LOCK -+ -+} diff --git a/src/main/java/org/galemc/gale/executor/thread/SignallableThread.java b/src/main/java/org/galemc/gale/executor/thread/SignallableThread.java new file mode 100644 -index 0000000000000000000000000000000000000000..a73aafc64dc60b57e2e5a91565e1aff612da6703 +index 0000000000000000000000000000000000000000..d9b2a445dd320979741fd659b1692eeec3c841f8 --- /dev/null +++ b/src/main/java/org/galemc/gale/executor/thread/SignallableThread.java -@@ -0,0 +1,31 @@ +@@ -0,0 +1,32 @@ +// Gale - base thread pool + +package org.galemc.gale.executor.thread; + +import org.galemc.gale.executor.annotation.thread.AnyThreadSafe; +import org.galemc.gale.executor.annotation.YieldFree; ++import org.galemc.gale.executor.thread.platform.SignalReason; +import org.jetbrains.annotations.Nullable; + +/** @@ -5687,9 +5689,39 @@ index 0000000000000000000000000000000000000000..77fe10e51b00115da520cfc211bf84ba + }; + +} +diff --git a/src/main/java/org/galemc/gale/executor/thread/platform/SignalReason.java b/src/main/java/org/galemc/gale/executor/thread/platform/SignalReason.java +new file mode 100644 +index 0000000000000000000000000000000000000000..c41824669e66f719d37ab5539fe6ab7f994a003f +--- /dev/null ++++ b/src/main/java/org/galemc/gale/executor/thread/platform/SignalReason.java +@@ -0,0 +1,24 @@ ++// Gale - base thread pool ++ ++package org.galemc.gale.executor.thread.platform; ++ ++import org.galemc.gale.executor.lock.YieldingLock; ++import org.galemc.gale.executor.thread.SignallableThread; ++ ++/** ++ * A reason of a call to {@link SignallableThread#signal}. ++ * ++ * @author Martijn Muijsers under AGPL-3.0 ++ */ ++public enum SignalReason { ++ ++ /** ++ * A task that the signalled thread could poll and start is available. ++ */ ++ TASK, ++ /** ++ * The {@link YieldingLock} that the signalled thread was waiting for was released. ++ */ ++ YIELDING_LOCK ++ ++} diff --git a/src/main/java/org/galemc/gale/executor/thread/pool/BaseThreadActivation.java b/src/main/java/org/galemc/gale/executor/thread/pool/BaseThreadActivation.java new file mode 100644 -index 0000000000000000000000000000000000000000..65ad5020c5c5953c801fb6c31416e8658720e15f +index 0000000000000000000000000000000000000000..ef6dc61f22ef4ab28da3213163fbc8b5479cfc16 --- /dev/null +++ b/src/main/java/org/galemc/gale/executor/thread/pool/BaseThreadActivation.java @@ -0,0 +1,659 @@ @@ -5706,7 +5738,7 @@ index 0000000000000000000000000000000000000000..65ad5020c5c5953c801fb6c31416e865 +import org.galemc.gale.executor.queue.BaseTaskQueueTier; +import org.galemc.gale.executor.thread.BaseThread; +import org.galemc.gale.executor.thread.ServerThread; -+import org.galemc.gale.executor.thread.SignalReason; ++import org.galemc.gale.executor.thread.platform.SignalReason; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + diff --git a/patches/server/0151-Watch-for-blocking-base-threads.patch b/patches/server/0151-Watch-for-blocking-base-threads.patch index 638e451..56b7b54 100644 --- a/patches/server/0151-Watch-for-blocking-base-threads.patch +++ b/patches/server/0151-Watch-for-blocking-base-threads.patch @@ -7,7 +7,7 @@ License: AGPL-3.0 (https://www.gnu.org/licenses/agpl-3.0.html) Gale - https://galemc.org diff --git a/build.gradle.kts b/build.gradle.kts -index a82ce4dfde0a81a85def5e3e5b09ba3a15aa73bc..f5999d4e9834e19669301612044857d34bd64daa 100644 +index ef633f7d1d48f8c2447c7d191f31ec646d641dca..e80a3bc48dfae7fcb22a9f4403a1fd8ef7852a58 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -15,6 +15,7 @@ dependencies { @@ -27,7 +27,7 @@ index a82ce4dfde0a81a85def5e3e5b09ba3a15aa73bc..f5999d4e9834e19669301612044857d3 val memoryGb = providers.gradleProperty("paper.runMemoryGb").getOrElse("2") val modifiedJvmArgs = jvmArgs ?: arrayListOf() @@ -188,6 +190,7 @@ fun TaskContainer.registerRunTask( - modifiedJvmArgs.addAll(listOf("--add-opens", "java.base/java.lang=ALL-UNNAMED")) + modifiedJvmArgs.addAll(listOf("--add-opens=java.base/java.lang=ALL-UNNAMED")) // Gale end - enable virtual threads for development runs modifiedJvmArgs.add("--add-modules=jdk.incubator.vector") // Gale - Pufferfish - SIMD support + modifiedJvmArgs.add("-XX:+AllowRedefinitionToAddDeleteMethods") // Gale - base thread pool - watch for blocking base threads diff --git a/patches/server/0164-Run-chunk-worker-tasks-on-base-thread-pool.patch b/patches/server/0164-Run-chunk-worker-tasks-on-base-thread-pool.patch index 9f13108..25ab1db 100644 --- a/patches/server/0164-Run-chunk-worker-tasks-on-base-thread-pool.patch +++ b/patches/server/0164-Run-chunk-worker-tasks-on-base-thread-pool.patch @@ -661,7 +661,7 @@ index 0000000000000000000000000000000000000000..0fac4a8b238636adb826a3d1a8db2040 + +} diff --git a/src/main/java/org/galemc/gale/executor/thread/BaseThread.java b/src/main/java/org/galemc/gale/executor/thread/BaseThread.java -index 4ec06cbff045bd42c1da5881cd0f2446cde39a7b..1a97a74e11a8c675980b3ec2e76b72057a203308 100644 +index cb1731f8c00f30a18aa042eaabc7f429fcaf9e2a..ce46283459ee5d9af9d8edd88d11322e354ffeae 100644 --- a/src/main/java/org/galemc/gale/executor/thread/BaseThread.java +++ b/src/main/java/org/galemc/gale/executor/thread/BaseThread.java @@ -2,6 +2,8 @@ @@ -673,15 +673,15 @@ index 4ec06cbff045bd42c1da5881cd0f2446cde39a7b..1a97a74e11a8c675980b3ec2e76b7205 import io.papermc.paper.util.TickThread; import net.minecraft.server.MinecraftServer; import org.galemc.gale.executor.TaskSpan; -@@ -16,6 +18,7 @@ import org.galemc.gale.executor.lock.YieldingLock; - import org.galemc.gale.executor.queue.AbstractTaskQueue; +@@ -17,6 +19,7 @@ import org.galemc.gale.executor.queue.AbstractTaskQueue; import org.galemc.gale.executor.queue.BaseTaskQueueTier; + import org.galemc.gale.executor.thread.platform.SignalReason; import org.galemc.gale.executor.thread.pool.*; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.concurrent.TimeUnit; -@@ -742,6 +745,20 @@ public abstract class BaseThread extends Thread implements AbstractYieldingThrea +@@ -743,6 +746,20 @@ public abstract class BaseThread extends Thread implements AbstractYieldingThrea } }