32 #include "compiler/compilerOracle.hpp" |
32 #include "compiler/compilerOracle.hpp" |
33 #include "compiler/disassembler.hpp" |
33 #include "compiler/disassembler.hpp" |
34 #include "interpreter/bytecode.hpp" |
34 #include "interpreter/bytecode.hpp" |
35 #include "oops/methodDataOop.hpp" |
35 #include "oops/methodDataOop.hpp" |
36 #include "prims/jvmtiRedefineClassesTrace.hpp" |
36 #include "prims/jvmtiRedefineClassesTrace.hpp" |
|
37 #include "prims/jvmtiImpl.hpp" |
37 #include "runtime/sharedRuntime.hpp" |
38 #include "runtime/sharedRuntime.hpp" |
38 #include "runtime/sweeper.hpp" |
39 #include "runtime/sweeper.hpp" |
39 #include "utilities/dtrace.hpp" |
40 #include "utilities/dtrace.hpp" |
40 #include "utilities/events.hpp" |
41 #include "utilities/events.hpp" |
41 #include "utilities/xmlstream.hpp" |
42 #include "utilities/xmlstream.hpp" |
1531 JvmtiExport::should_post_compiled_method_unload()) { |
1532 JvmtiExport::should_post_compiled_method_unload()) { |
1532 get_and_cache_jmethod_id(); |
1533 get_and_cache_jmethod_id(); |
1533 } |
1534 } |
1534 |
1535 |
1535 if (JvmtiExport::should_post_compiled_method_load()) { |
1536 if (JvmtiExport::should_post_compiled_method_load()) { |
1536 JvmtiExport::post_compiled_method_load(this); |
1537 // Let the Service thread (which is a real Java thread) post the event |
|
1538 MutexLockerEx ml(Service_lock, Mutex::_no_safepoint_check_flag); |
|
1539 JvmtiDeferredEventQueue::enqueue( |
|
1540 JvmtiDeferredEvent::compiled_method_load_event(this)); |
1537 } |
1541 } |
1538 } |
1542 } |
1539 |
1543 |
1540 jmethodID nmethod::get_and_cache_jmethod_id() { |
1544 jmethodID nmethod::get_and_cache_jmethod_id() { |
1541 if (_jmethod_id == NULL) { |
1545 if (_jmethod_id == NULL) { |
1564 // that the jmethodID is a weak reference to the methodOop so if |
1568 // that the jmethodID is a weak reference to the methodOop so if |
1565 // it's being unloaded there's no way to look it up since the weak |
1569 // it's being unloaded there's no way to look it up since the weak |
1566 // ref will have been cleared. |
1570 // ref will have been cleared. |
1567 if (_jmethod_id != NULL && JvmtiExport::should_post_compiled_method_unload()) { |
1571 if (_jmethod_id != NULL && JvmtiExport::should_post_compiled_method_unload()) { |
1568 assert(!unload_reported(), "already unloaded"); |
1572 assert(!unload_reported(), "already unloaded"); |
1569 HandleMark hm; |
1573 JvmtiDeferredEvent event = |
1570 JvmtiExport::post_compiled_method_unload(_jmethod_id, insts_begin()); |
1574 JvmtiDeferredEvent::compiled_method_unload_event( |
|
1575 _jmethod_id, insts_begin()); |
|
1576 if (SafepointSynchronize::is_at_safepoint()) { |
|
1577 // Don't want to take the queueing lock. Add it as pending and |
|
1578 // it will get enqueued later. |
|
1579 JvmtiDeferredEventQueue::add_pending_event(event); |
|
1580 } else { |
|
1581 MutexLockerEx ml(Service_lock, Mutex::_no_safepoint_check_flag); |
|
1582 JvmtiDeferredEventQueue::enqueue(event); |
|
1583 } |
1571 } |
1584 } |
1572 |
1585 |
1573 // The JVMTI CompiledMethodUnload event can be enabled or disabled at |
1586 // The JVMTI CompiledMethodUnload event can be enabled or disabled at |
1574 // any time. As the nmethod is being unloaded now we mark it has |
1587 // any time. As the nmethod is being unloaded now we mark it has |
1575 // having the unload event reported - this will ensure that we don't |
1588 // having the unload event reported - this will ensure that we don't |