2944 // jthread refers to a live JavaThread.
2945 receiver->interrupt();
2946 }
2947 JVM_END
2948
2949 // Return true iff the current thread has locked the object passed in
2950
2951 JVM_ENTRY(jboolean, JVM_HoldsLock(JNIEnv* env, jclass threadClass, jobject obj))
2952 if (obj == nullptr) {
2953 THROW_(vmSymbols::java_lang_NullPointerException(), JNI_FALSE);
2954 }
2955 Handle h_obj(THREAD, JNIHandles::resolve(obj));
2956 return ObjectSynchronizer::current_thread_holds_lock(thread, h_obj);
2957 JVM_END
2958
2959 JVM_ENTRY(jobject, JVM_GetStackTrace(JNIEnv *env, jobject jthread))
2960 oop trace = java_lang_Thread::async_get_stack_trace(JNIHandles::resolve(jthread), THREAD);
2961 return JNIHandles::make_local(THREAD, trace);
2962 JVM_END
2963
2964 JVM_ENTRY(void, JVM_SetNativeThreadName(JNIEnv* env, jobject jthread, jstring name))
2965 // We don't use a ThreadsListHandle here because the current thread
2966 // must be alive.
2967 oop java_thread = JNIHandles::resolve_non_null(jthread);
2968 JavaThread* thr = java_lang_Thread::thread(java_thread);
2969 if (thread == thr && !thr->has_attached_via_jni()) {
2970 // Thread naming is only supported for the current thread and
2971 // we don't set the name of an attached thread to avoid stepping
2972 // on other programs.
2973 ResourceMark rm(thread);
2974 const char *thread_name = java_lang_String::as_utf8_string(JNIHandles::resolve_non_null(name));
2975 os::set_native_thread_name(thread_name);
2976 }
2977 JVM_END
2978
2979 JVM_ENTRY(jobject, JVM_ScopedValueCache(JNIEnv* env, jclass threadClass))
2980 oop theCache = thread->scopedValueCache();
2981 return JNIHandles::make_local(THREAD, theCache);
2982 JVM_END
2983
3785
3786 JVM_ENTRY(jobject, JVM_TakeVirtualThreadListToUnblock(JNIEnv* env, jclass ignored))
3787 ParkEvent* parkEvent = ObjectMonitor::vthread_unparker_ParkEvent();
3788 assert(parkEvent != nullptr, "not initialized");
3789
3790 OopHandle& list_head = ObjectMonitor::vthread_list_head();
3791 oop vthread_head = nullptr;
3792 while (true) {
3793 if (list_head.peek() != nullptr) {
3794 for (;;) {
3795 oop head = list_head.resolve();
3796 if (list_head.cmpxchg(head, nullptr) == head) {
3797 return JNIHandles::make_local(THREAD, head);
3798 }
3799 }
3800 }
3801 ThreadBlockInVM tbivm(THREAD);
3802 parkEvent->park();
3803 }
3804 JVM_END
3805 /*
3806 * Return the current class's class file version. The low order 16 bits of the
3807 * returned jint contain the class's major version. The high order 16 bits
3808 * contain the class's minor version.
3809 */
3810 JVM_ENTRY(jint, JVM_GetClassFileVersion(JNIEnv* env, jclass current))
3811 oop mirror = JNIHandles::resolve_non_null(current);
3812 if (java_lang_Class::is_primitive(mirror)) {
3813 // return latest major version and minor version of 0.
3814 return JVM_CLASSFILE_MAJOR_VERSION;
3815 }
3816 assert(!java_lang_Class::as_Klass(mirror)->is_array_klass(), "unexpected array class");
3817
3818 Klass* c = java_lang_Class::as_Klass(mirror);
3819 assert(c->is_instance_klass(), "must be");
3820 InstanceKlass* ik = InstanceKlass::cast(c);
3821 return (ik->minor_version() << 16) | ik->major_version();
3822 JVM_END
3823
3824 /*
|
2944 // jthread refers to a live JavaThread.
2945 receiver->interrupt();
2946 }
2947 JVM_END
2948
2949 // Return true iff the current thread has locked the object passed in
2950
2951 JVM_ENTRY(jboolean, JVM_HoldsLock(JNIEnv* env, jclass threadClass, jobject obj))
2952 if (obj == nullptr) {
2953 THROW_(vmSymbols::java_lang_NullPointerException(), JNI_FALSE);
2954 }
2955 Handle h_obj(THREAD, JNIHandles::resolve(obj));
2956 return ObjectSynchronizer::current_thread_holds_lock(thread, h_obj);
2957 JVM_END
2958
2959 JVM_ENTRY(jobject, JVM_GetStackTrace(JNIEnv *env, jobject jthread))
2960 oop trace = java_lang_Thread::async_get_stack_trace(JNIHandles::resolve(jthread), THREAD);
2961 return JNIHandles::make_local(THREAD, trace);
2962 JVM_END
2963
2964 JVM_ENTRY(jobject, JVM_CreateThreadSnapshot(JNIEnv* env, jobject jthread, jboolean withLocks))
2965 oop snapshot = java_lang_Thread::get_thread_snapshot(jthread, withLocks != JNI_FALSE, THREAD);
2966 return JNIHandles::make_local(THREAD, snapshot);
2967 JVM_END
2968
2969 JVM_ENTRY(void, JVM_SetNativeThreadName(JNIEnv* env, jobject jthread, jstring name))
2970 // We don't use a ThreadsListHandle here because the current thread
2971 // must be alive.
2972 oop java_thread = JNIHandles::resolve_non_null(jthread);
2973 JavaThread* thr = java_lang_Thread::thread(java_thread);
2974 if (thread == thr && !thr->has_attached_via_jni()) {
2975 // Thread naming is only supported for the current thread and
2976 // we don't set the name of an attached thread to avoid stepping
2977 // on other programs.
2978 ResourceMark rm(thread);
2979 const char *thread_name = java_lang_String::as_utf8_string(JNIHandles::resolve_non_null(name));
2980 os::set_native_thread_name(thread_name);
2981 }
2982 JVM_END
2983
2984 JVM_ENTRY(jobject, JVM_ScopedValueCache(JNIEnv* env, jclass threadClass))
2985 oop theCache = thread->scopedValueCache();
2986 return JNIHandles::make_local(THREAD, theCache);
2987 JVM_END
2988
3790
3791 JVM_ENTRY(jobject, JVM_TakeVirtualThreadListToUnblock(JNIEnv* env, jclass ignored))
3792 ParkEvent* parkEvent = ObjectMonitor::vthread_unparker_ParkEvent();
3793 assert(parkEvent != nullptr, "not initialized");
3794
3795 OopHandle& list_head = ObjectMonitor::vthread_list_head();
3796 oop vthread_head = nullptr;
3797 while (true) {
3798 if (list_head.peek() != nullptr) {
3799 for (;;) {
3800 oop head = list_head.resolve();
3801 if (list_head.cmpxchg(head, nullptr) == head) {
3802 return JNIHandles::make_local(THREAD, head);
3803 }
3804 }
3805 }
3806 ThreadBlockInVM tbivm(THREAD);
3807 parkEvent->park();
3808 }
3809 JVM_END
3810
3811 /*
3812 * Return the current class's class file version. The low order 16 bits of the
3813 * returned jint contain the class's major version. The high order 16 bits
3814 * contain the class's minor version.
3815 */
3816 JVM_ENTRY(jint, JVM_GetClassFileVersion(JNIEnv* env, jclass current))
3817 oop mirror = JNIHandles::resolve_non_null(current);
3818 if (java_lang_Class::is_primitive(mirror)) {
3819 // return latest major version and minor version of 0.
3820 return JVM_CLASSFILE_MAJOR_VERSION;
3821 }
3822 assert(!java_lang_Class::as_Klass(mirror)->is_array_klass(), "unexpected array class");
3823
3824 Klass* c = java_lang_Class::as_Klass(mirror);
3825 assert(c->is_instance_klass(), "must be");
3826 InstanceKlass* ik = InstanceKlass::cast(c);
3827 return (ik->minor_version() << 16) | ik->major_version();
3828 JVM_END
3829
3830 /*
|