hotspot/src/share/vm/prims/jvmtiImpl.cpp
void JvmtiDeferredEvent::post() {
{- -------------------------------------------
(1) (assert)
---------------------------------------- -}
assert(ServiceThread::is_service_thread(Thread::current()),
"Service thread must post enqueued events");
{- -------------------------------------------
(1) 生成されたイベントの種別に応じて, 適切な通知用メソッドを呼び出す.
* TYPE_COMPILED_METHOD_LOAD の場合:
JvmtiExport::post_compiled_method_load() を呼び出す.
(ついでに, 通知が終わったので
JvmtiDeferredEvent::compiled_method_load_event() でロックした nmethod をアンロックしている)
* TYPE_COMPILED_METHOD_UNLOAD の場合:
JvmtiExport::post_compiled_method_unload() を呼び出す.
(ついでに, 通知が終わったので
JvmtiDeferredEvent::compiled_method_unload_event() でロックした nmethod をアンロックしている)
* TYPE_DYNAMIC_CODE_GENERATED の場合:
JvmtiExport::post_dynamic_code_generated_internal() を呼び出す.
(ついでに, JvmtiDeferredEvent::dynamic_code_generated_event() 内の
os::strdup() で確保したメモリを os::free() で開放している.
ただし, そもそも os::strdup() が失敗していた場合には開放処理は行っていない.)
---------------------------------------- -}
switch(_type) {
case TYPE_COMPILED_METHOD_LOAD: {
nmethod* nm = _event_data.compiled_method_load;
JvmtiExport::post_compiled_method_load(nm);
// done with the deferred event so unlock the nmethod
nmethodLocker::unlock_nmethod(nm);
break;
}
case TYPE_COMPILED_METHOD_UNLOAD: {
nmethod* nm = _event_data.compiled_method_unload.nm;
JvmtiExport::post_compiled_method_unload(
_event_data.compiled_method_unload.method_id,
_event_data.compiled_method_unload.code_begin);
// done with the deferred event so unlock the nmethod
nmethodLocker::unlock_nmethod(nm);
break;
}
case TYPE_DYNAMIC_CODE_GENERATED: {
JvmtiExport::post_dynamic_code_generated_internal(
// if strdup failed give the event a default name
(_event_data.dynamic_code_generated.name == NULL)
? "unknown_code" : _event_data.dynamic_code_generated.name,
_event_data.dynamic_code_generated.code_begin,
_event_data.dynamic_code_generated.code_end);
if (_event_data.dynamic_code_generated.name != NULL) {
// release our copy
os::free((void *)_event_data.dynamic_code_generated.name);
}
break;
}
default:
ShouldNotReachHere();
}
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.