Skip to content

Commit 75dfaa7

Browse files
committed
wip: use continuation via Loom
1 parent 7a3a97d commit 75dfaa7

File tree

4 files changed

+35
-11
lines changed

4 files changed

+35
-11
lines changed

substratevm/mx.substratevm/suite.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,20 @@
272272
},
273273

274274

275+
"com.oracle.svm.core.jdk19": {
276+
"subDir": "src",
277+
"sourceDirs": ["src"],
278+
"dependencies": ["com.oracle.svm.core"],
279+
"requiresConcealed" : {
280+
"java.base" : [
281+
],
282+
},
283+
"javaCompliance": "19+",
284+
"checkstyle": "com.oracle.svm.core",
285+
"workingSets": "SVM",
286+
},
287+
288+
275289
"com.oracle.svm.core.genscavenge": {
276290
"subDir": "src",
277291
"sourceDirs": [
@@ -1123,6 +1137,7 @@
11231137
"com.oracle.svm.hosted.jdk17",
11241138
"com.oracle.svm.core",
11251139
"com.oracle.svm.core.jdk17",
1140+
"com.oracle.svm.core.jdk19",
11261141
"com.oracle.svm.core.graal.amd64",
11271142
"com.oracle.svm.core.graal.aarch64",
11281143
"com.oracle.svm.core.posix",

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/thread/LoomVirtualThreads.java renamed to substratevm/src/com.oracle.svm.core.jdk19/src/com/oracle/svm/core/jdk19/LoomVirtualThreads.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,16 @@
2222
* or visit www.oracle.com if you need additional information or have any
2323
* questions.
2424
*/
25-
package com.oracle.svm.core.thread;
25+
package com.oracle.svm.core.jdk19;
2626

2727
import static java.util.concurrent.TimeUnit.MILLISECONDS;
2828

2929
import java.util.concurrent.Executor;
3030
import java.util.concurrent.ThreadFactory;
3131

32+
import com.oracle.svm.core.thread.Target_java_lang_Thread;
33+
import com.oracle.svm.core.thread.Target_java_lang_VirtualThread;
34+
import com.oracle.svm.core.thread.VirtualThreads;
3235
import org.graalvm.nativeimage.Platforms;
3336

3437
import com.oracle.svm.core.SubstrateUtil;
@@ -49,7 +52,7 @@ private static Target_java_lang_VirtualThread cast(Thread thread) {
4952

5053
@Override
5154
public ThreadFactory createFactory() {
52-
throw VMError.unimplemented();
55+
return Thread.ofVirtual().factory();
5356
}
5457

5558
@Override
@@ -61,7 +64,7 @@ public boolean isVirtual(Thread thread) {
6164
public void join(Thread thread, long millis) throws InterruptedException {
6265
if (thread.isAlive()) {
6366
long nanos = MILLISECONDS.toNanos(millis);
64-
cast(thread).joinNanos(nanos);
67+
// cast(thread).joinNanos(nanos);
6568
}
6669
}
6770

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/SubstrateOptions.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
import org.graalvm.compiler.options.OptionStability;
4848
import org.graalvm.compiler.options.OptionType;
4949
import org.graalvm.compiler.options.OptionValues;
50+
import org.graalvm.compiler.serviceprovider.JavaVersionUtil;
5051
import org.graalvm.nativeimage.ImageInfo;
5152
import org.graalvm.nativeimage.ImageSingletons;
5253
import org.graalvm.nativeimage.Platform;
@@ -134,11 +135,12 @@ protected void onValueUpdate(EconomicMap<OptionKey<?>, Object> values, Boolean o
134135
@Option(help = "Support continuations (without requiring a Project Loom JDK)") //
135136
public static final HostedOptionKey<Boolean> SupportContinuations = new HostedOptionKey<>(false);
136137

137-
@Option(help = "Build with Project Loom JDK") //
138+
@Option(help = "Support continuations via Virtual Threads") //
138139
public static final HostedOptionKey<Boolean> UseLoom = new HostedOptionKey<>(false) {
139140
@Override
140141
protected void onValueUpdate(EconomicMap<OptionKey<?>, Object> values, Boolean oldValue, Boolean newValue) {
141142
if (newValue) {
143+
assert JavaVersionUtil.JAVA_SPEC >= 19;
142144
SupportContinuations.update(values, true);
143145
}
144146
}

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/thread/ContinuationsFeature.java

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -49,23 +49,27 @@ public void afterRegistration(AfterRegistrationAccess access) {
4949
if (Continuation.isSupported()) {
5050
VirtualThreads impl;
5151
if (LoomSupport.isEnabled()) {
52-
impl = new LoomVirtualThreads();
52+
try {
53+
impl = (VirtualThreads) Class.forName("com.oracle.svm.core.jdk19.LoomVirtualThreads").getDeclaredConstructor().newInstance();
54+
} catch (Exception e) {
55+
throw UserError.abort(e, "Error initializing LoomVirtualThreads");
56+
}
5357
} else {
5458
/*
5559
* GR-37518: ForkJoinPool on 11 syncs on a String which doesn't have its own monitor
5660
* field, and unparking a virtual thread in additionalMonitorsLock.unlock causes a
5761
* deadlock between carrier thread and virtual thread. 17 uses a ReentrantLock.
5862
*/
5963
UserError.guarantee(JavaVersionUtil.JAVA_SPEC >= 17, "Continuations (%s) are currently supported only on JDK 17 and later.",
60-
SubstrateOptionsParser.commandArgument(SubstrateOptions.SupportContinuations, "+"));
64+
SubstrateOptionsParser.commandArgument(SubstrateOptions.SupportContinuations, "+"));
6165

6266
impl = new SubstrateVirtualThreads();
6367
}
6468
ImageSingletons.add(VirtualThreads.class, impl);
6569
} else {
6670
UserError.guarantee(!SubstrateOptions.UseLoom.getValue(), "%s cannot be enabled without option %s.",
67-
SubstrateOptionsParser.commandArgument(SubstrateOptions.UseLoom, "+"),
68-
SubstrateOptionsParser.commandArgument(SubstrateOptions.SupportContinuations, "+"));
71+
SubstrateOptionsParser.commandArgument(SubstrateOptions.UseLoom, "+"),
72+
SubstrateOptionsParser.commandArgument(SubstrateOptions.SupportContinuations, "+"));
6973
}
7074
}
7175

@@ -77,7 +81,7 @@ public void beforeAnalysis(BeforeAnalysisAccess access) {
7781
}
7882

7983
access.registerReachabilityHandler(a -> access.registerAsInHeap(StoredContinuation.class),
80-
ReflectionUtil.lookupMethod(StoredContinuationAccess.class, "allocate", int.class));
84+
ReflectionUtil.lookupMethod(StoredContinuationAccess.class, "allocate", int.class));
8185

8286
if (LoomSupport.isEnabled()) {
8387
RuntimeReflection.register(ReflectionUtil.lookupMethod(ForkJoinPool.class, "compensatedBlock", ForkJoinPool.ManagedBlocker.class));
@@ -90,8 +94,8 @@ public void beforeAnalysis(BeforeAnalysisAccess access) {
9094
static void abortIfUnsupported() {
9195
if (!Continuation.isSupported()) {
9296
throw UserError.abort("Continuation support is used, but not enabled. Use options %s or %s.",
93-
SubstrateOptionsParser.commandArgument(SubstrateOptions.SupportContinuations, "+"),
94-
SubstrateOptionsParser.commandArgument(SubstrateOptions.UseLoom, "+"));
97+
SubstrateOptionsParser.commandArgument(SubstrateOptions.SupportContinuations, "+"),
98+
SubstrateOptionsParser.commandArgument(SubstrateOptions.UseLoom, "+"));
9599
}
96100
}
97101
}

0 commit comments

Comments
 (0)