3097 }
3098 HOTSPOT_THREAD_SLEEP_END(0);
3099 JVM_END
3100
3101 JVM_ENTRY(jobject, JVM_CurrentCarrierThread(JNIEnv* env, jclass threadClass))
3102 oop jthread = thread->threadObj();
3103 assert(jthread != nullptr, "no current carrier thread!");
3104 return JNIHandles::make_local(THREAD, jthread);
3105 JVM_END
3106
3107 JVM_ENTRY(jobject, JVM_CurrentThread(JNIEnv* env, jclass threadClass))
3108 oop theThread = thread->vthread();
3109 assert(theThread != (oop)nullptr, "no current thread!");
3110 return JNIHandles::make_local(THREAD, theThread);
3111 JVM_END
3112
3113 JVM_ENTRY(void, JVM_SetCurrentThread(JNIEnv* env, jobject thisThread,
3114 jobject theThread))
3115 oop threadObj = JNIHandles::resolve(theThread);
3116 thread->set_vthread(threadObj);
3117 JFR_ONLY(Jfr::on_set_current_thread(thread, threadObj);)
3118 JVM_END
3119
3120 JVM_ENTRY(jlong, JVM_GetNextThreadIdOffset(JNIEnv* env, jclass threadClass))
3121 return ThreadIdentifier::unsafe_offset();
3122 JVM_END
3123
3124 JVM_ENTRY(void, JVM_Interrupt(JNIEnv* env, jobject jthread))
3125 ThreadsListHandle tlh(thread);
3126 JavaThread* receiver = nullptr;
3127 bool is_alive = tlh.cv_internal_thread_to_JavaThread(jthread, &receiver, nullptr);
3128 if (is_alive) {
3129 // jthread refers to a live JavaThread.
3130 receiver->interrupt();
3131 }
3132 JVM_END
3133
3134 // Return true iff the current thread has locked the object passed in
3135
3136 JVM_ENTRY(jboolean, JVM_HoldsLock(JNIEnv* env, jclass threadClass, jobject obj))
3983 assert(!thread->is_in_VTMS_transition(), "sanity check");
3984 assert(thread->is_in_tmp_VTMS_transition() != (bool)hide, "sanity check");
3985 thread->toggle_is_in_tmp_VTMS_transition();
3986 #endif
3987 JVM_END
3988
3989 // Notification from VirtualThread about disabling JVMTI Suspend in a sync critical section.
3990 // Needed to avoid deadlocks with JVMTI suspend mechanism.
3991 JVM_ENTRY(void, JVM_VirtualThreadDisableSuspend(JNIEnv* env, jclass clazz, jboolean enter))
3992 #if INCLUDE_JVMTI
3993 if (!DoJVMTIVirtualThreadTransitions) {
3994 assert(!JvmtiExport::can_support_virtual_threads(), "sanity check");
3995 return;
3996 }
3997 assert(thread->is_disable_suspend() != (bool)enter,
3998 "nested or unbalanced monitor enter/exit is not allowed");
3999 thread->toggle_is_disable_suspend();
4000 #endif
4001 JVM_END
4002
4003 /*
4004 * Return the current class's class file version. The low order 16 bits of the
4005 * returned jint contain the class's major version. The high order 16 bits
4006 * contain the class's minor version.
4007 */
4008 JVM_ENTRY(jint, JVM_GetClassFileVersion(JNIEnv* env, jclass current))
4009 oop mirror = JNIHandles::resolve_non_null(current);
4010 if (java_lang_Class::is_primitive(mirror)) {
4011 // return latest major version and minor version of 0.
4012 return JVM_CLASSFILE_MAJOR_VERSION;
4013 }
4014 assert(!java_lang_Class::as_Klass(mirror)->is_array_klass(), "unexpected array class");
4015
4016 Klass* c = java_lang_Class::as_Klass(mirror);
4017 assert(c->is_instance_klass(), "must be");
4018 InstanceKlass* ik = InstanceKlass::cast(c);
4019 return (ik->minor_version() << 16) | ik->major_version();
4020 JVM_END
4021
4022 /*
|
3097 }
3098 HOTSPOT_THREAD_SLEEP_END(0);
3099 JVM_END
3100
3101 JVM_ENTRY(jobject, JVM_CurrentCarrierThread(JNIEnv* env, jclass threadClass))
3102 oop jthread = thread->threadObj();
3103 assert(jthread != nullptr, "no current carrier thread!");
3104 return JNIHandles::make_local(THREAD, jthread);
3105 JVM_END
3106
3107 JVM_ENTRY(jobject, JVM_CurrentThread(JNIEnv* env, jclass threadClass))
3108 oop theThread = thread->vthread();
3109 assert(theThread != (oop)nullptr, "no current thread!");
3110 return JNIHandles::make_local(THREAD, theThread);
3111 JVM_END
3112
3113 JVM_ENTRY(void, JVM_SetCurrentThread(JNIEnv* env, jobject thisThread,
3114 jobject theThread))
3115 oop threadObj = JNIHandles::resolve(theThread);
3116 thread->set_vthread(threadObj);
3117
3118 // Set lock id of new current Thread
3119 thread->set_lock_id(java_lang_Thread::thread_id(threadObj));
3120
3121 JFR_ONLY(Jfr::on_set_current_thread(thread, threadObj);)
3122 JVM_END
3123
3124 JVM_ENTRY(jlong, JVM_GetNextThreadIdOffset(JNIEnv* env, jclass threadClass))
3125 return ThreadIdentifier::unsafe_offset();
3126 JVM_END
3127
3128 JVM_ENTRY(void, JVM_Interrupt(JNIEnv* env, jobject jthread))
3129 ThreadsListHandle tlh(thread);
3130 JavaThread* receiver = nullptr;
3131 bool is_alive = tlh.cv_internal_thread_to_JavaThread(jthread, &receiver, nullptr);
3132 if (is_alive) {
3133 // jthread refers to a live JavaThread.
3134 receiver->interrupt();
3135 }
3136 JVM_END
3137
3138 // Return true iff the current thread has locked the object passed in
3139
3140 JVM_ENTRY(jboolean, JVM_HoldsLock(JNIEnv* env, jclass threadClass, jobject obj))
3987 assert(!thread->is_in_VTMS_transition(), "sanity check");
3988 assert(thread->is_in_tmp_VTMS_transition() != (bool)hide, "sanity check");
3989 thread->toggle_is_in_tmp_VTMS_transition();
3990 #endif
3991 JVM_END
3992
3993 // Notification from VirtualThread about disabling JVMTI Suspend in a sync critical section.
3994 // Needed to avoid deadlocks with JVMTI suspend mechanism.
3995 JVM_ENTRY(void, JVM_VirtualThreadDisableSuspend(JNIEnv* env, jclass clazz, jboolean enter))
3996 #if INCLUDE_JVMTI
3997 if (!DoJVMTIVirtualThreadTransitions) {
3998 assert(!JvmtiExport::can_support_virtual_threads(), "sanity check");
3999 return;
4000 }
4001 assert(thread->is_disable_suspend() != (bool)enter,
4002 "nested or unbalanced monitor enter/exit is not allowed");
4003 thread->toggle_is_disable_suspend();
4004 #endif
4005 JVM_END
4006
4007 JVM_ENTRY_NO_ENV(void, JVM_VirtualThreadPinnedEvent(jint reasonCode, jstring reasonString))
4008 #if INCLUDE_JFR
4009 EventVirtualThreadPinned e;
4010 if (e.should_commit()) {
4011 ResourceMark rm(THREAD);
4012 // ignore reason code for now
4013 const char *reason = java_lang_String::as_utf8_string(JNIHandles::resolve_non_null(reasonString));
4014 e.set_pinnedReason(reason);
4015 e.set_carrierThread(JFR_JVM_THREAD_ID(THREAD));
4016 e.commit();
4017 }
4018 #endif
4019 JVM_END
4020
4021 JVM_ENTRY_NO_ENV(void, JVM_SetLockId(JNIEnv* env, jclass clazz, jlong tid))
4022 thread->set_lock_id(tid);
4023 JVM_END
4024
4025 JVM_ENTRY(jobject, JVM_TakeVirtualThreadListToUnblock(JNIEnv* env, jclass ignored))
4026 ParkEvent* parkEvent = ObjectMonitor::vthread_unparker_ParkEvent();
4027 assert(parkEvent != nullptr, "not initialized");
4028
4029 OopHandle& list_head = ObjectMonitor::vthread_cxq_head();
4030 oop vthread_head = nullptr;
4031 while (true) {
4032 if (list_head.peek() != nullptr) {
4033 for (;;) {
4034 oop head = list_head.resolve();
4035 if (list_head.cmpxchg(head, nullptr) == head) {
4036 return JNIHandles::make_local(THREAD, head);
4037 }
4038 }
4039 }
4040 ThreadBlockInVM tbivm(THREAD);
4041 parkEvent->park();
4042 }
4043 JVM_END
4044 /*
4045 * Return the current class's class file version. The low order 16 bits of the
4046 * returned jint contain the class's major version. The high order 16 bits
4047 * contain the class's minor version.
4048 */
4049 JVM_ENTRY(jint, JVM_GetClassFileVersion(JNIEnv* env, jclass current))
4050 oop mirror = JNIHandles::resolve_non_null(current);
4051 if (java_lang_Class::is_primitive(mirror)) {
4052 // return latest major version and minor version of 0.
4053 return JVM_CLASSFILE_MAJOR_VERSION;
4054 }
4055 assert(!java_lang_Class::as_Klass(mirror)->is_array_klass(), "unexpected array class");
4056
4057 Klass* c = java_lang_Class::as_Klass(mirror);
4058 assert(c->is_instance_klass(), "must be");
4059 InstanceKlass* ik = InstanceKlass::cast(c);
4060 return (ik->minor_version() << 16) | ik->major_version();
4061 JVM_END
4062
4063 /*
|