comparison src/share/vm/prims/jvmtiImpl.cpp @ 2342:46a56fac55c7

7024970: 2/3 assert(ServiceThread::is_service_thread(Thread::current())) failed: Service thread must post enqueue Summary: Change nmethod_lock() to also prevent zombification of the nmethod. CompiledMethodUnload events also need to lock the nmethod. Clean ups in nmethod::make_not_entrant_or_zombie() Reviewed-by: dholmes, kamg, never, dsamersoff, ysr, coleenp, acorn
author dcubed
date Tue, 15 Mar 2011 06:37:31 -0700
parents f91db74a6810
children 0cddebc420d8
comparison
equal deleted inserted replaced
2341:216d916d5c12 2342:46a56fac55c7
917 917
918 JvmtiDeferredEvent JvmtiDeferredEvent::compiled_method_load_event( 918 JvmtiDeferredEvent JvmtiDeferredEvent::compiled_method_load_event(
919 nmethod* nm) { 919 nmethod* nm) {
920 JvmtiDeferredEvent event = JvmtiDeferredEvent(TYPE_COMPILED_METHOD_LOAD); 920 JvmtiDeferredEvent event = JvmtiDeferredEvent(TYPE_COMPILED_METHOD_LOAD);
921 event._event_data.compiled_method_load = nm; 921 event._event_data.compiled_method_load = nm;
922 nmethodLocker::lock_nmethod(nm); // will be unlocked when posted 922 // Keep the nmethod alive until the ServiceThread can process
923 // this deferred event.
924 nmethodLocker::lock_nmethod(nm);
923 return event; 925 return event;
924 } 926 }
925 927
926 JvmtiDeferredEvent JvmtiDeferredEvent::compiled_method_unload_event( 928 JvmtiDeferredEvent JvmtiDeferredEvent::compiled_method_unload_event(
927 jmethodID id, const void* code) { 929 nmethod* nm, jmethodID id, const void* code) {
928 JvmtiDeferredEvent event = JvmtiDeferredEvent(TYPE_COMPILED_METHOD_UNLOAD); 930 JvmtiDeferredEvent event = JvmtiDeferredEvent(TYPE_COMPILED_METHOD_UNLOAD);
931 event._event_data.compiled_method_unload.nm = nm;
929 event._event_data.compiled_method_unload.method_id = id; 932 event._event_data.compiled_method_unload.method_id = id;
930 event._event_data.compiled_method_unload.code_begin = code; 933 event._event_data.compiled_method_unload.code_begin = code;
934 // Keep the nmethod alive until the ServiceThread can process
935 // this deferred event. This will keep the memory for the
936 // generated code from being reused too early. We pass
937 // zombie_ok == true here so that our nmethod that was just
938 // made into a zombie can be locked.
939 nmethodLocker::lock_nmethod(nm, true /* zombie_ok */);
931 return event; 940 return event;
932 } 941 }
933 JvmtiDeferredEvent JvmtiDeferredEvent::dynamic_code_generated_event( 942 JvmtiDeferredEvent JvmtiDeferredEvent::dynamic_code_generated_event(
934 const char* name, const void* code_begin, const void* code_end) { 943 const char* name, const void* code_begin, const void* code_end) {
935 JvmtiDeferredEvent event = JvmtiDeferredEvent(TYPE_DYNAMIC_CODE_GENERATED); 944 JvmtiDeferredEvent event = JvmtiDeferredEvent(TYPE_DYNAMIC_CODE_GENERATED);
944 "Service thread must post enqueued events"); 953 "Service thread must post enqueued events");
945 switch(_type) { 954 switch(_type) {
946 case TYPE_COMPILED_METHOD_LOAD: { 955 case TYPE_COMPILED_METHOD_LOAD: {
947 nmethod* nm = _event_data.compiled_method_load; 956 nmethod* nm = _event_data.compiled_method_load;
948 JvmtiExport::post_compiled_method_load(nm); 957 JvmtiExport::post_compiled_method_load(nm);
958 // done with the deferred event so unlock the nmethod
949 nmethodLocker::unlock_nmethod(nm); 959 nmethodLocker::unlock_nmethod(nm);
950 break; 960 break;
951 } 961 }
952 case TYPE_COMPILED_METHOD_UNLOAD: 962 case TYPE_COMPILED_METHOD_UNLOAD: {
963 nmethod* nm = _event_data.compiled_method_unload.nm;
953 JvmtiExport::post_compiled_method_unload( 964 JvmtiExport::post_compiled_method_unload(
954 _event_data.compiled_method_unload.method_id, 965 _event_data.compiled_method_unload.method_id,
955 _event_data.compiled_method_unload.code_begin); 966 _event_data.compiled_method_unload.code_begin);
967 // done with the deferred event so unlock the nmethod
968 nmethodLocker::unlock_nmethod(nm);
956 break; 969 break;
970 }
957 case TYPE_DYNAMIC_CODE_GENERATED: 971 case TYPE_DYNAMIC_CODE_GENERATED:
958 JvmtiExport::post_dynamic_code_generated_internal( 972 JvmtiExport::post_dynamic_code_generated_internal(
959 _event_data.dynamic_code_generated.name, 973 _event_data.dynamic_code_generated.name,
960 _event_data.dynamic_code_generated.code_begin, 974 _event_data.dynamic_code_generated.code_begin,
961 _event_data.dynamic_code_generated.code_end); 975 _event_data.dynamic_code_generated.code_end);