hotspot/src/share/vm/prims/jvm.cpp
changeset 5089 0cce506a0158
parent 4573 6358f8c9ed3b
child 5547 f4b087cbb361
equal deleted inserted replaced
5088:a7a4e66595ec 5089:0cce506a0158
    23  */
    23  */
    24 
    24 
    25 #include "incls/_precompiled.incl"
    25 #include "incls/_precompiled.incl"
    26 #include "incls/_jvm.cpp.incl"
    26 #include "incls/_jvm.cpp.incl"
    27 #include <errno.h>
    27 #include <errno.h>
       
    28 
       
    29 HS_DTRACE_PROBE_DECL1(hotspot, thread__sleep__begin, long long);
       
    30 HS_DTRACE_PROBE_DECL1(hotspot, thread__sleep__end, int);
       
    31 HS_DTRACE_PROBE_DECL0(hotspot, thread__yield);
    28 
    32 
    29 /*
    33 /*
    30   NOTE about use of any ctor or function call that can trigger a safepoint/GC:
    34   NOTE about use of any ctor or function call that can trigger a safepoint/GC:
    31   such ctors and calls MUST NOT come between an oop declaration/init and its
    35   such ctors and calls MUST NOT come between an oop declaration/init and its
    32   usage because if objects are move this may cause various memory stomps, bus
    36   usage because if objects are move this may cause various memory stomps, bus
  2760 
  2764 
  2761 
  2765 
  2762 JVM_ENTRY(void, JVM_Yield(JNIEnv *env, jclass threadClass))
  2766 JVM_ENTRY(void, JVM_Yield(JNIEnv *env, jclass threadClass))
  2763   JVMWrapper("JVM_Yield");
  2767   JVMWrapper("JVM_Yield");
  2764   if (os::dont_yield()) return;
  2768   if (os::dont_yield()) return;
       
  2769   HS_DTRACE_PROBE0(hotspot, thread__yield);
  2765   // When ConvertYieldToSleep is off (default), this matches the classic VM use of yield.
  2770   // When ConvertYieldToSleep is off (default), this matches the classic VM use of yield.
  2766   // Critical for similar threading behaviour
  2771   // Critical for similar threading behaviour
  2767   if (ConvertYieldToSleep) {
  2772   if (ConvertYieldToSleep) {
  2768     os::sleep(thread, MinSleepInterval, false);
  2773     os::sleep(thread, MinSleepInterval, false);
  2769   } else {
  2774   } else {
  2784   }
  2789   }
  2785 
  2790 
  2786   // Save current thread state and restore it at the end of this block.
  2791   // Save current thread state and restore it at the end of this block.
  2787   // And set new thread state to SLEEPING.
  2792   // And set new thread state to SLEEPING.
  2788   JavaThreadSleepState jtss(thread);
  2793   JavaThreadSleepState jtss(thread);
       
  2794 
       
  2795   HS_DTRACE_PROBE1(hotspot, thread__sleep__begin, millis);
  2789 
  2796 
  2790   if (millis == 0) {
  2797   if (millis == 0) {
  2791     // When ConvertSleepToYield is on, this matches the classic VM implementation of
  2798     // When ConvertSleepToYield is on, this matches the classic VM implementation of
  2792     // JVM_Sleep. Critical for similar threading behaviour (Win32)
  2799     // JVM_Sleep. Critical for similar threading behaviour (Win32)
  2793     // It appears that in certain GUI contexts, it may be beneficial to do a short sleep
  2800     // It appears that in certain GUI contexts, it may be beneficial to do a short sleep
  2805     thread->osthread()->set_state(SLEEPING);
  2812     thread->osthread()->set_state(SLEEPING);
  2806     if (os::sleep(thread, millis, true) == OS_INTRPT) {
  2813     if (os::sleep(thread, millis, true) == OS_INTRPT) {
  2807       // An asynchronous exception (e.g., ThreadDeathException) could have been thrown on
  2814       // An asynchronous exception (e.g., ThreadDeathException) could have been thrown on
  2808       // us while we were sleeping. We do not overwrite those.
  2815       // us while we were sleeping. We do not overwrite those.
  2809       if (!HAS_PENDING_EXCEPTION) {
  2816       if (!HAS_PENDING_EXCEPTION) {
       
  2817         HS_DTRACE_PROBE1(hotspot, thread__sleep__end,1);
  2810         // TODO-FIXME: THROW_MSG returns which means we will not call set_state()
  2818         // TODO-FIXME: THROW_MSG returns which means we will not call set_state()
  2811         // to properly restore the thread state.  That's likely wrong.
  2819         // to properly restore the thread state.  That's likely wrong.
  2812         THROW_MSG(vmSymbols::java_lang_InterruptedException(), "sleep interrupted");
  2820         THROW_MSG(vmSymbols::java_lang_InterruptedException(), "sleep interrupted");
  2813       }
  2821       }
  2814     }
  2822     }
  2815     thread->osthread()->set_state(old_state);
  2823     thread->osthread()->set_state(old_state);
  2816   }
  2824   }
       
  2825   HS_DTRACE_PROBE1(hotspot, thread__sleep__end,0);
  2817 JVM_END
  2826 JVM_END
  2818 
  2827 
  2819 JVM_ENTRY(jobject, JVM_CurrentThread(JNIEnv* env, jclass threadClass))
  2828 JVM_ENTRY(jobject, JVM_CurrentThread(JNIEnv* env, jclass threadClass))
  2820   JVMWrapper("JVM_CurrentThread");
  2829   JVMWrapper("JVM_CurrentThread");
  2821   oop jthread = thread->threadObj();
  2830   oop jthread = thread->threadObj();