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