Mercurial > hg > truffle
comparison src/share/vm/prims/jvm.cpp @ 14521:29ccc4cbabca
Merge
author | Gilles Duboscq <duboscq@ssw.jku.at> |
---|---|
date | Wed, 12 Mar 2014 13:30:08 +0100 |
parents | d8041d695d19 |
children | b51e29501f30 4ca6dc0799b6 |
comparison
equal
deleted
inserted
replaced
14520:f84115370178 | 14521:29ccc4cbabca |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. | 2 * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | 4 * |
5 * This code is free software; you can redistribute it and/or modify it | 5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as | 6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
74 # include "jvm_solaris.h" | 74 # include "jvm_solaris.h" |
75 #endif | 75 #endif |
76 #ifdef TARGET_OS_FAMILY_windows | 76 #ifdef TARGET_OS_FAMILY_windows |
77 # include "jvm_windows.h" | 77 # include "jvm_windows.h" |
78 #endif | 78 #endif |
79 #ifdef TARGET_OS_FAMILY_aix | |
80 # include "jvm_aix.h" | |
81 #endif | |
79 #ifdef TARGET_OS_FAMILY_bsd | 82 #ifdef TARGET_OS_FAMILY_bsd |
80 # include "jvm_bsd.h" | 83 # include "jvm_bsd.h" |
81 #endif | 84 #endif |
82 | 85 |
83 #include <errno.h> | 86 #include <errno.h> |
84 | |
85 #ifndef USDT2 | |
86 HS_DTRACE_PROBE_DECL1(hotspot, thread__sleep__begin, long long); | |
87 HS_DTRACE_PROBE_DECL1(hotspot, thread__sleep__end, int); | |
88 HS_DTRACE_PROBE_DECL0(hotspot, thread__yield); | |
89 #endif /* !USDT2 */ | |
90 | 87 |
91 /* | 88 /* |
92 NOTE about use of any ctor or function call that can trigger a safepoint/GC: | 89 NOTE about use of any ctor or function call that can trigger a safepoint/GC: |
93 such ctors and calls MUST NOT come between an oop declaration/init and its | 90 such ctors and calls MUST NOT come between an oop declaration/init and its |
94 usage because if objects are move this may cause various memory stomps, bus | 91 usage because if objects are move this may cause various memory stomps, bus |
518 JVMWrapper("JVM_MonitorWait"); | 515 JVMWrapper("JVM_MonitorWait"); |
519 Handle obj(THREAD, JNIHandles::resolve_non_null(handle)); | 516 Handle obj(THREAD, JNIHandles::resolve_non_null(handle)); |
520 JavaThreadInObjectWaitState jtiows(thread, ms != 0); | 517 JavaThreadInObjectWaitState jtiows(thread, ms != 0); |
521 if (JvmtiExport::should_post_monitor_wait()) { | 518 if (JvmtiExport::should_post_monitor_wait()) { |
522 JvmtiExport::post_monitor_wait((JavaThread *)THREAD, (oop)obj(), ms); | 519 JvmtiExport::post_monitor_wait((JavaThread *)THREAD, (oop)obj(), ms); |
520 | |
521 // The current thread already owns the monitor and it has not yet | |
522 // been added to the wait queue so the current thread cannot be | |
523 // made the successor. This means that the JVMTI_EVENT_MONITOR_WAIT | |
524 // event handler cannot accidentally consume an unpark() meant for | |
525 // the ParkEvent associated with this ObjectMonitor. | |
523 } | 526 } |
524 ObjectSynchronizer::wait(obj, ms, CHECK); | 527 ObjectSynchronizer::wait(obj, ms, CHECK); |
525 JVM_END | 528 JVM_END |
526 | 529 |
527 | 530 |
1249 } | 1252 } |
1250 | 1253 |
1251 if (HAS_PENDING_EXCEPTION) { | 1254 if (HAS_PENDING_EXCEPTION) { |
1252 pending_exception = Handle(THREAD, PENDING_EXCEPTION); | 1255 pending_exception = Handle(THREAD, PENDING_EXCEPTION); |
1253 CLEAR_PENDING_EXCEPTION; | 1256 CLEAR_PENDING_EXCEPTION; |
1254 | 1257 // JVMTI has already reported the pending exception |
1258 // JVMTI internal flag reset is needed in order to report PrivilegedActionException | |
1259 if (THREAD->is_Java_thread()) { | |
1260 JvmtiExport::clear_detected_exception((JavaThread*) THREAD); | |
1261 } | |
1255 if ( pending_exception->is_a(SystemDictionary::Exception_klass()) && | 1262 if ( pending_exception->is_a(SystemDictionary::Exception_klass()) && |
1256 !pending_exception->is_a(SystemDictionary::RuntimeException_klass())) { | 1263 !pending_exception->is_a(SystemDictionary::RuntimeException_klass())) { |
1257 // Throw a java.security.PrivilegedActionException(Exception e) exception | 1264 // Throw a java.security.PrivilegedActionException(Exception e) exception |
1258 JavaCallArguments args(pending_exception); | 1265 JavaCallArguments args(pending_exception); |
1259 THROW_ARG_0(vmSymbols::java_security_PrivilegedActionException(), | 1266 THROW_ARG_0(vmSymbols::java_security_PrivilegedActionException(), |
2886 // No one should hold a reference to the 'native_thread'. | 2893 // No one should hold a reference to the 'native_thread'. |
2887 delete native_thread; | 2894 delete native_thread; |
2888 if (JvmtiExport::should_post_resource_exhausted()) { | 2895 if (JvmtiExport::should_post_resource_exhausted()) { |
2889 JvmtiExport::post_resource_exhausted( | 2896 JvmtiExport::post_resource_exhausted( |
2890 JVMTI_RESOURCE_EXHAUSTED_OOM_ERROR | JVMTI_RESOURCE_EXHAUSTED_THREADS, | 2897 JVMTI_RESOURCE_EXHAUSTED_OOM_ERROR | JVMTI_RESOURCE_EXHAUSTED_THREADS, |
2891 "unable to create new native thread"); | 2898 os::native_thread_creation_failed_msg()); |
2892 } | 2899 } |
2893 THROW_MSG(vmSymbols::java_lang_OutOfMemoryError(), | 2900 THROW_MSG(vmSymbols::java_lang_OutOfMemoryError(), |
2894 "unable to create new native thread"); | 2901 os::native_thread_creation_failed_msg()); |
2895 } | 2902 } |
2896 | 2903 |
2897 Thread::start(native_thread); | 2904 Thread::start(native_thread); |
2898 | 2905 |
2899 JVM_END | 2906 JVM_END |
3013 | 3020 |
3014 | 3021 |
3015 JVM_ENTRY(void, JVM_Yield(JNIEnv *env, jclass threadClass)) | 3022 JVM_ENTRY(void, JVM_Yield(JNIEnv *env, jclass threadClass)) |
3016 JVMWrapper("JVM_Yield"); | 3023 JVMWrapper("JVM_Yield"); |
3017 if (os::dont_yield()) return; | 3024 if (os::dont_yield()) return; |
3018 #ifndef USDT2 | |
3019 HS_DTRACE_PROBE0(hotspot, thread__yield); | |
3020 #else /* USDT2 */ | |
3021 HOTSPOT_THREAD_YIELD(); | 3025 HOTSPOT_THREAD_YIELD(); |
3022 #endif /* USDT2 */ | 3026 |
3023 // When ConvertYieldToSleep is off (default), this matches the classic VM use of yield. | 3027 // When ConvertYieldToSleep is off (default), this matches the classic VM use of yield. |
3024 // Critical for similar threading behaviour | 3028 // Critical for similar threading behaviour |
3025 if (ConvertYieldToSleep) { | 3029 if (ConvertYieldToSleep) { |
3026 os::sleep(thread, MinSleepInterval, false); | 3030 os::sleep(thread, MinSleepInterval, false); |
3027 } else { | 3031 } else { |
3043 | 3047 |
3044 // Save current thread state and restore it at the end of this block. | 3048 // Save current thread state and restore it at the end of this block. |
3045 // And set new thread state to SLEEPING. | 3049 // And set new thread state to SLEEPING. |
3046 JavaThreadSleepState jtss(thread); | 3050 JavaThreadSleepState jtss(thread); |
3047 | 3051 |
3048 #ifndef USDT2 | 3052 HOTSPOT_THREAD_SLEEP_BEGIN(millis); |
3049 HS_DTRACE_PROBE1(hotspot, thread__sleep__begin, millis); | |
3050 #else /* USDT2 */ | |
3051 HOTSPOT_THREAD_SLEEP_BEGIN( | |
3052 millis); | |
3053 #endif /* USDT2 */ | |
3054 | 3053 |
3055 EventThreadSleep event; | 3054 EventThreadSleep event; |
3056 | 3055 |
3057 if (millis == 0) { | 3056 if (millis == 0) { |
3058 // When ConvertSleepToYield is on, this matches the classic VM implementation of | 3057 // When ConvertSleepToYield is on, this matches the classic VM implementation of |
3076 if (!HAS_PENDING_EXCEPTION) { | 3075 if (!HAS_PENDING_EXCEPTION) { |
3077 if (event.should_commit()) { | 3076 if (event.should_commit()) { |
3078 event.set_time(millis); | 3077 event.set_time(millis); |
3079 event.commit(); | 3078 event.commit(); |
3080 } | 3079 } |
3081 #ifndef USDT2 | 3080 HOTSPOT_THREAD_SLEEP_END(1); |
3082 HS_DTRACE_PROBE1(hotspot, thread__sleep__end,1); | 3081 |
3083 #else /* USDT2 */ | |
3084 HOTSPOT_THREAD_SLEEP_END( | |
3085 1); | |
3086 #endif /* USDT2 */ | |
3087 // TODO-FIXME: THROW_MSG returns which means we will not call set_state() | 3082 // TODO-FIXME: THROW_MSG returns which means we will not call set_state() |
3088 // to properly restore the thread state. That's likely wrong. | 3083 // to properly restore the thread state. That's likely wrong. |
3089 THROW_MSG(vmSymbols::java_lang_InterruptedException(), "sleep interrupted"); | 3084 THROW_MSG(vmSymbols::java_lang_InterruptedException(), "sleep interrupted"); |
3090 } | 3085 } |
3091 } | 3086 } |
3093 } | 3088 } |
3094 if (event.should_commit()) { | 3089 if (event.should_commit()) { |
3095 event.set_time(millis); | 3090 event.set_time(millis); |
3096 event.commit(); | 3091 event.commit(); |
3097 } | 3092 } |
3098 #ifndef USDT2 | 3093 HOTSPOT_THREAD_SLEEP_END(0); |
3099 HS_DTRACE_PROBE1(hotspot, thread__sleep__end,0); | |
3100 #else /* USDT2 */ | |
3101 HOTSPOT_THREAD_SLEEP_END( | |
3102 0); | |
3103 #endif /* USDT2 */ | |
3104 JVM_END | 3094 JVM_END |
3105 | 3095 |
3106 JVM_ENTRY(jobject, JVM_CurrentThread(JNIEnv* env, jclass threadClass)) | 3096 JVM_ENTRY(jobject, JVM_CurrentThread(JNIEnv* env, jclass threadClass)) |
3107 JVMWrapper("JVM_CurrentThread"); | 3097 JVMWrapper("JVM_CurrentThread"); |
3108 oop jthread = thread->threadObj(); | 3098 oop jthread = thread->threadObj(); |
3982 } | 3972 } |
3983 return (jclass) JNIHandles::make_local(env, klass_handle->java_mirror()); | 3973 return (jclass) JNIHandles::make_local(env, klass_handle->java_mirror()); |
3984 } | 3974 } |
3985 | 3975 |
3986 | 3976 |
3987 // Internal SQE debugging support /////////////////////////////////////////////////////////// | |
3988 | |
3989 #ifndef PRODUCT | |
3990 | |
3991 extern "C" { | |
3992 JNIEXPORT jboolean JNICALL JVM_AccessVMBooleanFlag(const char* name, jboolean* value, jboolean is_get); | |
3993 JNIEXPORT jboolean JNICALL JVM_AccessVMIntFlag(const char* name, jint* value, jboolean is_get); | |
3994 JNIEXPORT void JNICALL JVM_VMBreakPoint(JNIEnv *env, jobject obj); | |
3995 } | |
3996 | |
3997 JVM_LEAF(jboolean, JVM_AccessVMBooleanFlag(const char* name, jboolean* value, jboolean is_get)) | |
3998 JVMWrapper("JVM_AccessBoolVMFlag"); | |
3999 return is_get ? CommandLineFlags::boolAt((char*) name, (bool*) value) : CommandLineFlags::boolAtPut((char*) name, (bool*) value, Flag::INTERNAL); | |
4000 JVM_END | |
4001 | |
4002 JVM_LEAF(jboolean, JVM_AccessVMIntFlag(const char* name, jint* value, jboolean is_get)) | |
4003 JVMWrapper("JVM_AccessVMIntFlag"); | |
4004 intx v; | |
4005 jboolean result = is_get ? CommandLineFlags::intxAt((char*) name, &v) : CommandLineFlags::intxAtPut((char*) name, &v, Flag::INTERNAL); | |
4006 *value = (jint)v; | |
4007 return result; | |
4008 JVM_END | |
4009 | |
4010 | |
4011 JVM_ENTRY(void, JVM_VMBreakPoint(JNIEnv *env, jobject obj)) | |
4012 JVMWrapper("JVM_VMBreakPoint"); | |
4013 oop the_obj = JNIHandles::resolve(obj); | |
4014 BREAKPOINT; | |
4015 JVM_END | |
4016 | |
4017 | |
4018 #endif | |
4019 | |
4020 | |
4021 // Method /////////////////////////////////////////////////////////////////////////////////////////// | 3977 // Method /////////////////////////////////////////////////////////////////////////////////////////// |
4022 | 3978 |
4023 JVM_ENTRY(jobject, JVM_InvokeMethod(JNIEnv *env, jobject method, jobject obj, jobjectArray args0)) | 3979 JVM_ENTRY(jobject, JVM_InvokeMethod(JNIEnv *env, jobject method, jobject obj, jobjectArray args0)) |
4024 JVMWrapper("JVM_InvokeMethod"); | 3980 JVMWrapper("JVM_InvokeMethod"); |
4025 Handle method_handle; | 3981 Handle method_handle; |