Mercurial > hg > truffle
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); |