Skip to content

Commit

Permalink
Implement JVM_VirtualThreadMount/JVM_VirtualThreadUnmount
Browse files Browse the repository at this point in the history
- Move code of APIs of JDK 20 such as JVM_VirtualThreadMountBegin
  to helpers so they can be called by APIs of both JDK 20 and 21
- Hide frames between mount/unmount begin and mount/unmount end

Fixes eclipse-openj9#16984

Signed-off-by: Gengchen Tuo <gengchen.tuo@ibm.com>
  • Loading branch information
thallium authored and dipak-bagadiya committed May 24, 2023
1 parent 37e239e commit d36f56c
Show file tree
Hide file tree
Showing 2 changed files with 57 additions and 16 deletions.
61 changes: 46 additions & 15 deletions runtime/j9vm/javanextvmi.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -272,8 +272,8 @@ exitVThreadTransitionCritical(J9VMThread *currentThread, j9object_t vthread)
J9OBJECT_I64_STORE(currentThread, vthread, currentThread->javaVM->virtualThreadInspectorCountOffset, 0);
}

JNIEXPORT void JNICALL
JVM_VirtualThreadMountBegin(JNIEnv *env, jobject thread, jboolean firstMount)
static void
virtualThreadMountBegin(JNIEnv *env, jobject thread, jboolean firstMount)
{
J9VMThread *currentThread = (J9VMThread *)env;
J9JavaVM *vm = currentThread->javaVM;
Expand Down Expand Up @@ -305,8 +305,8 @@ JVM_VirtualThreadMountBegin(JNIEnv *env, jobject thread, jboolean firstMount)
Trc_SC_VirtualThreadMountBegin_Exit(currentThread, thread, firstMount);
}

JNIEXPORT void JNICALL
JVM_VirtualThreadMountEnd(JNIEnv *env, jobject thread, jboolean firstMount)
static void
virtualThreadMountEnd(JNIEnv *env, jobject thread, jboolean firstMount)
{
J9VMThread *currentThread = (J9VMThread *)env;
J9JavaVM *vm = currentThread->javaVM;
Expand Down Expand Up @@ -356,8 +356,8 @@ JVM_VirtualThreadMountEnd(JNIEnv *env, jobject thread, jboolean firstMount)
Trc_SC_VirtualThreadMountEnd_Exit(currentThread, thread, firstMount);
}

JNIEXPORT void JNICALL
JVM_VirtualThreadUnmountBegin(JNIEnv *env, jobject thread, jboolean lastUnmount)
static void
virtualThreadUnmountBegin(JNIEnv *env, jobject thread, jboolean lastUnmount)
{
J9VMThread *currentThread = (J9VMThread *)env;
J9JavaVM *vm = currentThread->javaVM;
Expand Down Expand Up @@ -400,8 +400,8 @@ JVM_VirtualThreadUnmountBegin(JNIEnv *env, jobject thread, jboolean lastUnmount)
Trc_SC_VirtualThreadUnmountBegin_Exit(currentThread, thread, lastUnmount);
}

JNIEXPORT void JNICALL
JVM_VirtualThreadUnmountEnd(JNIEnv *env, jobject thread, jboolean lastUnmount)
static void
virtualThreadUnmountEnd(JNIEnv *env, jobject thread, jboolean lastUnmount)
{
J9VMThread *currentThread = (J9VMThread *)env;
J9JavaVM *vm = currentThread->javaVM;
Expand Down Expand Up @@ -448,6 +448,32 @@ JVM_VirtualThreadUnmountEnd(JNIEnv *env, jobject thread, jboolean lastUnmount)
}
#endif /* JAVA_SPEC_VERSION >= 19 */

#if JAVA_SPEC_VERSION >= 19 && JAVA_SPEC_VERSION < 21
JNIEXPORT void JNICALL
JVM_VirtualThreadMountBegin(JNIEnv *env, jobject thread, jboolean firstMount)
{
virtualThreadMountBegin(env, thread, firstMount);
}

JNIEXPORT void JNICALL
JVM_VirtualThreadMountEnd(JNIEnv *env, jobject thread, jboolean firstMount)
{
virtualThreadMountEnd(env, thread, firstMount);
}

JNIEXPORT void JNICALL
JVM_VirtualThreadUnmountBegin(JNIEnv *env, jobject thread, jboolean lastUnmount)
{
virtualThreadUnmountBegin(env, thread, lastUnmount);
}

JNIEXPORT void JNICALL
JVM_VirtualThreadUnmountEnd(JNIEnv *env, jobject thread, jboolean lastUnmount)
{
virtualThreadUnmountEnd(env, thread, lastUnmount);
}
#endif /* JAVA_SPEC_VERSION >= 19 && JAVA_SPEC_VERSION < 21 */

#if JAVA_SPEC_VERSION >= 20
JNIEXPORT jint JNICALL
JVM_GetClassFileVersion(JNIEnv *env, jclass cls)
Expand All @@ -474,36 +500,41 @@ JNIEXPORT void JNICALL
JVM_VirtualThreadHideFrames(JNIEnv *env, jobject vthread, jboolean hide)
{
J9VMThread *currentThread = (J9VMThread *)env;
Assert_SC_true(IS_JAVA_LANG_VIRTUALTHREAD(currentThread, currentThread->threadObject));

Assert_SC_true(IS_JAVA_LANG_VIRTUALTHREAD(currentThread, currentThread->threadObject));
if (hide) {
Assert_SC_true(J9_ARE_NO_BITS_SET(currentThread->privateFlags, J9_PRIVATE_FLAGS_VIRTUAL_THREAD_HIDDEN_FRAMES));
currentThread->privateFlags |= J9_PRIVATE_FLAGS_VIRTUAL_THREAD_HIDDEN_FRAMES;
} else {
Assert_SC_true(J9_ARE_ALL_BITS_SET(currentThread->privateFlags, J9_PRIVATE_FLAGS_VIRTUAL_THREAD_HIDDEN_FRAMES));
currentThread->privateFlags &= ~(UDATA)J9_PRIVATE_FLAGS_VIRTUAL_THREAD_HIDDEN_FRAMES;
}
VM_VMHelpers::virtualThreadHideFrames(currentThread, hide);
}
#endif /* JAVA_SPEC_VERSION >= 20 */

#if JAVA_SPEC_VERSION >= 21
JNIEXPORT void JNICALL
JVM_VirtualThreadMount(JNIEnv* env, jobject vthread, jboolean hide, jboolean firstMount)
{
J9VMThread *currentThread = (J9VMThread *)env;

VM_VMHelpers::virtualThreadHideFrames(currentThread, hide);
if (hide) {
JVM_VirtualThreadMountBegin(env, vthread, firstMount);
virtualThreadMountBegin(env, vthread, firstMount);
} else {
JVM_VirtualThreadMountEnd(env, vthread, firstMount);
virtualThreadMountEnd(env, vthread, firstMount);
}
}

JNIEXPORT void JNICALL
JVM_VirtualThreadUnmount(JNIEnv* env, jobject vthread, jboolean hide, jboolean lastUnmount)
{
J9VMThread *currentThread = (J9VMThread *)env;

VM_VMHelpers::virtualThreadHideFrames(currentThread, hide);
if (hide) {
JVM_VirtualThreadUnmountBegin(env, vthread, lastUnmount);
virtualThreadUnmountBegin(env, vthread, lastUnmount);
} else {
JVM_VirtualThreadUnmountEnd(env, vthread, lastUnmount);
virtualThreadUnmountEnd(env, vthread, lastUnmount);
}
}
#endif /* JAVA_SPEC_VERSION >= 21 */
Expand Down
12 changes: 11 additions & 1 deletion runtime/oti/VMHelpers.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -2062,6 +2062,16 @@ class VM_VMHelpers
return oldState;
}

};
#if JAVA_SPEC_VERSION >= 20
static VMINLINE void
virtualThreadHideFrames(J9VMThread *currentThread, jboolean hide) {
if (hide) {
currentThread->privateFlags |= J9_PRIVATE_FLAGS_VIRTUAL_THREAD_HIDDEN_FRAMES;
} else {
currentThread->privateFlags &= ~(UDATA)J9_PRIVATE_FLAGS_VIRTUAL_THREAD_HIDDEN_FRAMES;
}
}
#endif /* JAVA_SPEC_VERSION >= 20 */
};

#endif /* VMHELPERS_HPP_ */

0 comments on commit d36f56c

Please sign in to comment.