< prev index next >

src/hotspot/share/prims/jvm.cpp

Print this page




2957   JVMWrapper("JVM_Yield");
2958   if (os::dont_yield()) return;
2959   HOTSPOT_THREAD_YIELD();
2960   os::naked_yield();
2961 JVM_END
2962 
2963 static void post_thread_sleep_event(EventThreadSleep* event, jlong millis) {
2964   assert(event != NULL, "invariant");
2965   assert(event->should_commit(), "invariant");
2966   event->set_time(millis);
2967   event->commit();
2968 }
2969 
2970 JVM_ENTRY(void, JVM_Sleep(JNIEnv* env, jclass threadClass, jlong millis))
2971   JVMWrapper("JVM_Sleep");
2972 
2973   if (millis < 0) {
2974     THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "timeout value is negative");
2975   }
2976 
2977   if (Thread::is_interrupted (THREAD, true) && !HAS_PENDING_EXCEPTION) {
2978     THROW_MSG(vmSymbols::java_lang_InterruptedException(), "sleep interrupted");
2979   }
2980 
2981   // Save current thread state and restore it at the end of this block.
2982   // And set new thread state to SLEEPING.
2983   JavaThreadSleepState jtss(thread);
2984 
2985   HOTSPOT_THREAD_SLEEP_BEGIN(millis);
2986   EventThreadSleep event;
2987 
2988   if (millis == 0) {
2989     os::naked_yield();
2990   } else {
2991     ThreadState old_state = thread->osthread()->get_state();
2992     thread->osthread()->set_state(SLEEPING);
2993     if (!thread->sleep(millis)) { // interrupted
2994       // An asynchronous exception (e.g., ThreadDeathException) could have been thrown on
2995       // us while we were sleeping. We do not overwrite those.
2996       if (!HAS_PENDING_EXCEPTION) {
2997         if (event.should_commit()) {


3054     Handshake::execute(&csf, receiver);
3055     if (!csf.suspended()) {
3056       THROW_MSG_0(vmSymbols::java_lang_IllegalThreadStateException(),
3057                   "this thread is not suspended");
3058     }
3059     return csf.count();
3060   }
3061   // Implied else: if JavaThread is not alive simply return a count of 0.
3062   return 0;
3063 JVM_END
3064 
3065 
3066 JVM_ENTRY(void, JVM_Interrupt(JNIEnv* env, jobject jthread))
3067   JVMWrapper("JVM_Interrupt");
3068 
3069   ThreadsListHandle tlh(thread);
3070   JavaThread* receiver = NULL;
3071   bool is_alive = tlh.cv_internal_thread_to_JavaThread(jthread, &receiver, NULL);
3072   if (is_alive) {
3073     // jthread refers to a live JavaThread.
3074     Thread::interrupt(receiver);
3075   }
3076 JVM_END
3077 
3078 
3079 JVM_ENTRY(jboolean, JVM_IsInterrupted(JNIEnv* env, jobject jthread, jboolean clear_interrupted))
3080   JVMWrapper("JVM_IsInterrupted");
3081 
3082   ThreadsListHandle tlh(thread);
3083   JavaThread* receiver = NULL;
3084   bool is_alive = tlh.cv_internal_thread_to_JavaThread(jthread, &receiver, NULL);
3085   if (is_alive) {
3086     // jthread refers to a live JavaThread.
3087     return (jboolean) Thread::is_interrupted(receiver, clear_interrupted != 0);
3088   } else {
3089     return JNI_FALSE;
3090   }
3091 JVM_END
3092 
3093 
3094 // Return true iff the current thread has locked the object passed in
3095 
3096 JVM_ENTRY(jboolean, JVM_HoldsLock(JNIEnv* env, jclass threadClass, jobject obj))
3097   JVMWrapper("JVM_HoldsLock");
3098   assert(THREAD->is_Java_thread(), "sanity check");
3099   if (obj == NULL) {
3100     THROW_(vmSymbols::java_lang_NullPointerException(), JNI_FALSE);
3101   }
3102   Handle h_obj(THREAD, JNIHandles::resolve(obj));
3103   return ObjectSynchronizer::current_thread_holds_lock((JavaThread*)THREAD, h_obj);
3104 JVM_END
3105 
3106 
3107 JVM_ENTRY(void, JVM_DumpAllStacks(JNIEnv* env, jclass))




2957   JVMWrapper("JVM_Yield");
2958   if (os::dont_yield()) return;
2959   HOTSPOT_THREAD_YIELD();
2960   os::naked_yield();
2961 JVM_END
2962 
2963 static void post_thread_sleep_event(EventThreadSleep* event, jlong millis) {
2964   assert(event != NULL, "invariant");
2965   assert(event->should_commit(), "invariant");
2966   event->set_time(millis);
2967   event->commit();
2968 }
2969 
2970 JVM_ENTRY(void, JVM_Sleep(JNIEnv* env, jclass threadClass, jlong millis))
2971   JVMWrapper("JVM_Sleep");
2972 
2973   if (millis < 0) {
2974     THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "timeout value is negative");
2975   }
2976 
2977   if (thread->is_interrupted(true) && !HAS_PENDING_EXCEPTION) {
2978     THROW_MSG(vmSymbols::java_lang_InterruptedException(), "sleep interrupted");
2979   }
2980 
2981   // Save current thread state and restore it at the end of this block.
2982   // And set new thread state to SLEEPING.
2983   JavaThreadSleepState jtss(thread);
2984 
2985   HOTSPOT_THREAD_SLEEP_BEGIN(millis);
2986   EventThreadSleep event;
2987 
2988   if (millis == 0) {
2989     os::naked_yield();
2990   } else {
2991     ThreadState old_state = thread->osthread()->get_state();
2992     thread->osthread()->set_state(SLEEPING);
2993     if (!thread->sleep(millis)) { // interrupted
2994       // An asynchronous exception (e.g., ThreadDeathException) could have been thrown on
2995       // us while we were sleeping. We do not overwrite those.
2996       if (!HAS_PENDING_EXCEPTION) {
2997         if (event.should_commit()) {


3054     Handshake::execute(&csf, receiver);
3055     if (!csf.suspended()) {
3056       THROW_MSG_0(vmSymbols::java_lang_IllegalThreadStateException(),
3057                   "this thread is not suspended");
3058     }
3059     return csf.count();
3060   }
3061   // Implied else: if JavaThread is not alive simply return a count of 0.
3062   return 0;
3063 JVM_END
3064 
3065 
3066 JVM_ENTRY(void, JVM_Interrupt(JNIEnv* env, jobject jthread))
3067   JVMWrapper("JVM_Interrupt");
3068 
3069   ThreadsListHandle tlh(thread);
3070   JavaThread* receiver = NULL;
3071   bool is_alive = tlh.cv_internal_thread_to_JavaThread(jthread, &receiver, NULL);
3072   if (is_alive) {
3073     // jthread refers to a live JavaThread.
3074     receiver->interrupt();
3075   }
3076 JVM_END
3077 
3078 
3079 JVM_ENTRY(jboolean, JVM_IsInterrupted(JNIEnv* env, jobject jthread, jboolean clear_interrupted))
3080   JVMWrapper("JVM_IsInterrupted");
3081 
3082   ThreadsListHandle tlh(thread);
3083   JavaThread* receiver = NULL;
3084   bool is_alive = tlh.cv_internal_thread_to_JavaThread(jthread, &receiver, NULL);
3085   if (is_alive) {
3086     // jthread refers to a live JavaThread.
3087     return (jboolean) receiver->is_interrupted(clear_interrupted != 0);
3088   } else {
3089     return JNI_FALSE;
3090   }
3091 JVM_END
3092 
3093 
3094 // Return true iff the current thread has locked the object passed in
3095 
3096 JVM_ENTRY(jboolean, JVM_HoldsLock(JNIEnv* env, jclass threadClass, jobject obj))
3097   JVMWrapper("JVM_HoldsLock");
3098   assert(THREAD->is_Java_thread(), "sanity check");
3099   if (obj == NULL) {
3100     THROW_(vmSymbols::java_lang_NullPointerException(), JNI_FALSE);
3101   }
3102   Handle h_obj(THREAD, JNIHandles::resolve(obj));
3103   return ObjectSynchronizer::current_thread_holds_lock((JavaThread*)THREAD, h_obj);
3104 JVM_END
3105 
3106 
3107 JVM_ENTRY(void, JVM_DumpAllStacks(JNIEnv* env, jclass))


< prev index next >