From be359a85ee267ad6db7f37834bd08724d152ab42 Mon Sep 17 00:00:00 2001 From: Peter Hofer Date: Fri, 6 Oct 2023 19:19:22 +0200 Subject: [PATCH] [GR-48899] Support TIMED_WAITING for virtual threads. (cherry picked from commit 4fad6c2661356dfd51afe82d88009b549bfdbedb) --- .../Target_java_lang_VirtualThread.java | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/thread/Target_java_lang_VirtualThread.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/thread/Target_java_lang_VirtualThread.java index d5b96ba0ed44..020d0b2dabe3 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/thread/Target_java_lang_VirtualThread.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/thread/Target_java_lang_VirtualThread.java @@ -45,6 +45,7 @@ import com.oracle.svm.core.jdk.JDK20OrEarlier; import com.oracle.svm.core.jdk.JDK20OrLater; import com.oracle.svm.core.jdk.JDK21OrLater; +import com.oracle.svm.core.jdk.JDK22OrLater; import com.oracle.svm.core.jdk.LoomJDK; import com.oracle.svm.core.jfr.HasJfrSupport; import com.oracle.svm.core.jfr.SubstrateJVM; @@ -64,12 +65,10 @@ public final class Target_java_lang_VirtualThread { @Alias static int PINNED; @Alias static int YIELDING; @Alias static int TERMINATED; - @Alias // - @TargetElement(onlyWith = JDK21OrEarlier.class) // - static int RUNNABLE_SUSPENDED; - @Alias // - @TargetElement(onlyWith = JDK21OrEarlier.class) // - static int PARKED_SUSPENDED; + @Alias static int SUSPENDED; + @TargetElement(onlyWith = JDK22OrLater.class) @Alias static int TIMED_PARKING; + @TargetElement(onlyWith = JDK22OrLater.class) @Alias static int TIMED_PARKED; + @TargetElement(onlyWith = JDK22OrLater.class) @Alias static int TIMED_PINNED; @Alias static Target_jdk_internal_vm_ContinuationScope VTHREAD_SCOPE; // Checkstyle: resume @@ -161,7 +160,7 @@ void unmount() { @Substitute Thread.State threadState() { - int state = state(); + int state = state() & ~SUSPENDED; if (state == NEW) { return Thread.State.NEW; } else if (state == STARTED) { @@ -170,7 +169,7 @@ Thread.State threadState() { } else { return Thread.State.RUNNABLE; } - } else if (state == RUNNABLE || (JavaVersionUtil.JAVA_SPEC <= 21 && state == RUNNABLE_SUSPENDED)) { + } else if (state == RUNNABLE) { return Thread.State.RUNNABLE; } else if (state == RUNNING) { Object token = VirtualThreadHelper.acquireInterruptLockMaybeSwitch(this); @@ -185,7 +184,7 @@ Thread.State threadState() { return Thread.State.RUNNABLE; } else if (state == PARKING || state == YIELDING) { return Thread.State.RUNNABLE; - } else if (state == PARKED || (JavaVersionUtil.JAVA_SPEC <= 21 && state == PARKED_SUSPENDED) || state == PINNED) { + } else if (state == PARKED || state == PINNED) { int parkedThreadStatus = MonitorSupport.singleton().getParkedThreadStatus(asThread(this), false); switch (parkedThreadStatus) { case ThreadStatus.BLOCKED_ON_MONITOR_ENTER: @@ -198,6 +197,12 @@ Thread.State threadState() { } } else if (state == TERMINATED) { return Thread.State.TERMINATED; + } else if (JavaVersionUtil.JAVA_SPEC >= 22) { + if (state == TIMED_PARKING) { + return Thread.State.RUNNABLE; + } else if (state == TIMED_PARKED || state == TIMED_PINNED) { + return Thread.State.TIMED_WAITING; + } } throw new InternalError(); }