hotspot/src/share/vm/prims/jvmtiEnv.cpp
// event_thread - NULL is a valid value, must be checked
jvmtiError
JvmtiEnv::SetEventNotificationMode(jvmtiEventMode mode, jvmtiEvent event_type, jthread event_thread, ...) {
{- -------------------------------------------
(1) (変数宣言など)
---------------------------------------- -}
JavaThread* java_thread = NULL;
{- -------------------------------------------
(1) 処理対象のスレッドが指定されていれば (= event_thread 引数が NULL でなければ),
処理対象に対応する JavaThread を取得する.
(取得に失敗したら, ここでリターン(JVMTI_ERROR_INVALID_THREAD, JVMTI_ERROR_THREAD_NOT_ALIVE))
なお, スレッド指定なし(= 全スレッドが対象) のケースは, java_thread 変数を NULL のままにすることで表現している.
---------------------------------------- -}
if (event_thread != NULL) {
oop thread_oop = JNIHandles::resolve_external_guard(event_thread);
if (thread_oop == NULL) {
return JVMTI_ERROR_INVALID_THREAD;
}
if (!thread_oop->is_a(SystemDictionary::Thread_klass())) {
return JVMTI_ERROR_INVALID_THREAD;
}
java_thread = java_lang_Thread::thread(thread_oop);
if (java_thread == NULL) {
return JVMTI_ERROR_THREAD_NOT_ALIVE;
}
}
{- -------------------------------------------
(1) event_type 引数が不正であれば, ここでリターン(JVMTI_ERROR_INVALID_EVENT_TYPE)
(ここでは単に enum の範囲内かどうかをチェックしているだけ)
---------------------------------------- -}
// event_type must be valid
if (!JvmtiEventController::is_valid_event_type(event_type)) {
return JVMTI_ERROR_INVALID_EVENT_TYPE;
}
{- -------------------------------------------
(1) event_type 引数が不正であれば, ここでリターン(JVMTI_ERROR_ILLEGAL_ARGUMENT)
(処理対象のスレッドが指定されているのに, event_type がスレッド単位では指定できない種別のものだったケース)
---------------------------------------- -}
// global events cannot be controlled at thread level.
if (java_thread != NULL && JvmtiEventController::is_global_event(event_type)) {
return JVMTI_ERROR_ILLEGAL_ARGUMENT;
}
{- -------------------------------------------
(1) もし必要な capabilities を取得していなければ, ここでリターン(JVMTI_ERROR_MUST_POSSESS_CAPABILITY).
---------------------------------------- -}
bool enabled = (mode == JVMTI_ENABLE);
// assure that needed capabilities are present
if (enabled && !JvmtiUtil::has_event_capability(event_type, get_capabilities())) {
return JVMTI_ERROR_MUST_POSSESS_CAPABILITY;
}
{- -------------------------------------------
(1) もし JVMTI_EVENT_CLASS_FILE_LOAD_HOOK が enabled と指定されていたら,
JvmtiEnvBase::record_class_file_load_hook_enabled() を呼び出して
先に can_retransform_classes capability が取得されていたかどうかをチェックしておく.
(これは, 「retransform capability を取得する場合は
ClassFileLoadHook が有効化されるまでに取得しないといけない」という
JVMTI 仕様上の制約のための処理.)
---------------------------------------- -}
if (event_type == JVMTI_EVENT_CLASS_FILE_LOAD_HOOK && enabled) {
record_class_file_load_hook_enabled();
}
{- -------------------------------------------
(1) JvmtiEventController::set_user_enabled() を呼び出して, イベント通知の有効化処理を行う.
---------------------------------------- -}
JvmtiEventController::set_user_enabled(this, java_thread, event_type, enabled);
{- -------------------------------------------
(1) リターン
---------------------------------------- -}
return JVMTI_ERROR_NONE;
} /* end SetEventNotificationMode */
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.