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(); |