Skip to content

Commit 2383bbd

Browse files
authored
Merge pull request #20566 from fengxue-IS/jep491-1
Support JEP491 (Part 1)
2 parents 741422b + 4c127d4 commit 2383bbd

File tree

10 files changed

+89
-4
lines changed

10 files changed

+89
-4
lines changed

jcl/src/java.base/share/classes/java/lang/Object.java

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@
2222
*/
2323
package java.lang;
2424

25-
/*[IF JAVA_SPEC_VERSION >= 19]*/
25+
/*[IF (JAVA_SPEC_VERSION >= 19) & (JAVA_SPEC_VERSION < 24)]*/
2626
import jdk.internal.misc.Blocker;
27-
/*[ENDIF] JAVA_SPEC_VERSION >= 19 */
27+
/*[ENDIF] (JAVA_SPEC_VERSION >= 19) & (JAVA_SPEC_VERSION < 24) */
2828

2929
/**
3030
* Object is the root of the java class hierarchy. All non-base types
@@ -283,7 +283,7 @@ public final void wait(long time, int frac) throws InterruptedException {
283283
} finally {
284284
Blocker.end(blockerRC);
285285
}
286-
/*[ELSE] JAVA_SPEC_VERSION < 23 */
286+
/*[ELSEIF JAVA_SPEC_VERSION < 24] */
287287
if (!Thread.currentThread().isVirtual()) {
288288
waitImpl(time, frac);
289289
} else {
@@ -294,6 +294,21 @@ public final void wait(long time, int frac) throws InterruptedException {
294294
Blocker.end(blocking);
295295
}
296296
}
297+
/*[ELSE] JAVA_SPEC_VERSION < 24 */
298+
if ((time < 0) || (frac < 0)) {
299+
throw new IllegalArgumentException("timeout value is negative");
300+
}
301+
if (!Thread.currentThread().isVirtual()) {
302+
waitImpl(time, frac);
303+
} else {
304+
try {
305+
waitImpl(time, frac);
306+
} catch (InterruptedException e) {
307+
// Clear virtual thread's interrupt status
308+
Thread.currentThread().getAndClearInterrupt();
309+
throw e;
310+
}
311+
}
297312
/*[ENDIF] JAVA_SPEC_VERSION < 19 */
298313
}
299314

jcl/src/java.base/share/classes/java/lang/PinnedThreadPrinter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/*[INCLUDE-IF JAVA_SPEC_VERSION >= 21]*/
1+
/*[INCLUDE-IF (JAVA_SPEC_VERSION >= 21) & (JAVA_SPEC_VERSION < 24)]*/
22
/*
33
* Copyright IBM Corp. and others 2023
44
*

jcl/src/java.base/share/classes/java/lang/ref/Reference.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,9 +96,11 @@ public void runFinalization() {
9696
/*[ENDIF] JAVA_SPEC_VERSION >= 11 */
9797

9898
/*[IF JAVA_SPEC_VERSION >= 19]*/
99+
/*[IF JAVA_SPEC_VERSION < 24] */
99100
public <T> ReferenceQueue<T> newNativeReferenceQueue() {
100101
return new NativeReferenceQueue<>();
101102
}
103+
/*[ENDIF] JAVA_SPEC_VERSION < 24 */
102104

103105
public void startThreads() {
104106
throw new UnsupportedOperationException();

jcl/src/java.base/share/classes/java/lang/ref/ReferenceQueue.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,11 @@
2828
import sun.misc.Cleaner;
2929
/*[ENDIF] JAVA_SPEC_VERSION >= 9 */
3030

31+
/*[IF JAVA_SPEC_VERSION >= 24]*/
32+
import jdk.internal.vm.Continuation;
33+
34+
/*[ENDIF] JAVA_SPEC_VERSION >= 24*/
35+
3136
/*[IF CRIU_SUPPORT]*/
3237
import openj9.internal.criu.NotCheckpointSafe;
3338
/*[ENDIF] CRIU_SUPPORT */
@@ -89,6 +94,14 @@ public Reference<? extends T> poll () {
8994
if(empty) {
9095
return null;
9196
}
97+
98+
/*[IF JAVA_SPEC_VERSION >= 24]*/
99+
boolean isVirtual = false;
100+
if (Thread.currentThread().isVirtual()) {
101+
isVirtual = true;
102+
Continuation.pin();
103+
}
104+
/*[ENDIF] JAVA_SPEC_VERSION >= 24*/
92105
synchronized(this) {
93106
if(empty) {
94107
return null;
@@ -104,6 +117,11 @@ public Reference<? extends T> poll () {
104117
empty = true;
105118
}
106119
}
120+
/*[IF JAVA_SPEC_VERSION >= 24]*/
121+
if (isVirtual) {
122+
Continuation.unpin();
123+
}
124+
/*[ENDIF] JAVA_SPEC_VERSION >= 24*/
107125
return ref;
108126
}
109127

runtime/j9vm/exports.cmake

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -468,6 +468,8 @@ if(NOT JAVA_SPEC_VERSION LESS 24)
468468
jvm_add_exports(jvm
469469
JVM_IsContainerized
470470
JVM_IsStaticallyLinked
471+
JVM_VirtualThreadPinnedEvent
472+
JVM_TakeVirtualThreadListToUnblock
471473
)
472474
endif()
473475

runtime/j9vm/j9vmnatives.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -482,5 +482,9 @@ SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 OR GPL-2.0-only WITH Classpath-ex
482482
<!-- Additions for Java 24 (General) -->
483483
<export name="JVM_IsContainerized"/>
484484
<export name="JVM_IsStaticallyLinked"/>
485+
486+
<!-- Additions for Java 24 (VirtualThread JEP491) -->
487+
<export name="JVM_VirtualThreadPinnedEvent"/>
488+
<export name="JVM_TakeVirtualThreadListToUnblock"/>
485489
</exports>
486490
</exportlists>

runtime/j9vm/javanextvmi.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -799,6 +799,20 @@ JVM_IsStaticallyLinked(void)
799799
/* OpenJDK removed static builds using --enable-static-build. */
800800
return JNI_FALSE;
801801
}
802+
803+
JNIEXPORT void JNICALL
804+
JVM_VirtualThreadPinnedEvent(JNIEnv* env, jclass clazz, jstring op)
805+
{
806+
// TODO: emit JFR Event
807+
return;
808+
}
809+
810+
JNIEXPORT jobject JNICALL
811+
JVM_TakeVirtualThreadListToUnblock(JNIEnv* env, jclass ignored)
812+
{
813+
// TODO: return the unblocked list
814+
return NULL;
815+
}
802816
#endif /* JAVA_SPEC_VERSION >= 24 */
803817

804818
} /* extern "C" */

runtime/jvmti/jvmtiHelpers.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -900,16 +900,33 @@ getVirtualThreadState(J9VMThread *currentThread, jthread thread)
900900
case JVMTI_VTHREAD_STATE_UNPARKED:
901901
case JVMTI_VTHREAD_STATE_YIELDING:
902902
case JVMTI_VTHREAD_STATE_YIELDED:
903+
#if JAVA_SPEC_VERSION >= 24
904+
case JVMTI_VTHREAD_STATE_UNBLOCKED:
905+
case JVMTI_VTHREAD_STATE_WAITING:
906+
case JVMTI_VTHREAD_STATE_TIMED_WAITING:
907+
#endif /* JAVA_SPEC_VERSION >= 24 */
903908
rc = JVMTI_JAVA_LANG_THREAD_STATE_RUNNABLE;
904909
break;
905910
case JVMTI_VTHREAD_STATE_PINNED:
906911
case JVMTI_VTHREAD_STATE_PARKED:
912+
#if JAVA_SPEC_VERSION >= 24
913+
case JVMTI_VTHREAD_STATE_WAIT:
914+
#endif /* JAVA_SPEC_VERSION >= 24 */
907915
rc = JVMTI_JAVA_LANG_THREAD_STATE_WAITING | JVMTI_THREAD_STATE_PARKED;
908916
break;
909917
case JVMTI_VTHREAD_STATE_TIMED_PINNED:
910918
case JVMTI_VTHREAD_STATE_TIMED_PARKED:
919+
#if JAVA_SPEC_VERSION >= 24
920+
case JVMTI_VTHREAD_STATE_TIMED_WAIT:
921+
#endif /* JAVA_SPEC_VERSION >= 24 */
911922
rc = JVMTI_JAVA_LANG_THREAD_STATE_TIMED_WAITING | JVMTI_THREAD_STATE_PARKED;
912923
break;
924+
#if JAVA_SPEC_VERSION >= 24
925+
case JVMTI_VTHREAD_STATE_BLOCKING:
926+
case JVMTI_VTHREAD_STATE_BLOCKED:
927+
rc = JVMTI_JAVA_LANG_THREAD_STATE_BLOCKED;
928+
break;
929+
#endif /* JAVA_SPEC_VERSION >= 24 */
913930
case JVMTI_VTHREAD_STATE_TERMINATED:
914931
rc = JVMTI_JAVA_LANG_THREAD_STATE_TERMINATED;
915932
break;

runtime/oti/jvmtiInternal.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -587,6 +587,15 @@ typedef struct jvmtiGcp_translation {
587587
#define JVMTI_VTHREAD_STATE_UNPARKED 9
588588
#define JVMTI_VTHREAD_STATE_YIELDING 10
589589
#define JVMTI_VTHREAD_STATE_YIELDED 11
590+
#if JAVA_SPEC_VERSION >= 24
591+
#define JVMTI_VTHREAD_STATE_BLOCKING 12
592+
#define JVMTI_VTHREAD_STATE_BLOCKED 13
593+
#define JVMTI_VTHREAD_STATE_UNBLOCKED 14
594+
#define JVMTI_VTHREAD_STATE_WAITING 15
595+
#define JVMTI_VTHREAD_STATE_WAIT 16
596+
#define JVMTI_VTHREAD_STATE_TIMED_WAITING 17
597+
#define JVMTI_VTHREAD_STATE_TIMED_WAIT 18
598+
#endif /* JAVA_SPEC_VERSION >= 24 */
590599
#define JVMTI_VTHREAD_STATE_TERMINATED 99
591600
#define JVMTI_VTHREAD_STATE_SUSPENDED (1 << 8)
592601
#endif /* JAVA_SPEC_VERSION >= 19 */

runtime/redirector/forwarders.m4

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -446,3 +446,7 @@ _IF([JAVA_SPEC_VERSION >= 24],
446446
[_X(JVM_IsContainerized, JNICALL, false, jboolean, void)])
447447
_IF([JAVA_SPEC_VERSION >= 24],
448448
[_X(JVM_IsStaticallyLinked, JNICALL, false, jboolean, void)])
449+
_IF([JAVA_SPEC_VERSION >= 24],
450+
[_X(JVM_VirtualThreadPinnedEvent, JNICALL, false, void, JNIEnv* env, jclass clazz, jstring op)])
451+
_IF([JAVA_SPEC_VERSION >= 24],
452+
[_X(JVM_TakeVirtualThreadListToUnblock, JNICALL, false, jobject, JNIEnv* env, jclass ignored)])

0 commit comments

Comments
 (0)