< prev index next >

src/hotspot/share/prims/jvm.cpp

Print this page

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 /*
< prev index next >