hotspot/src/share/vm/prims/jvmtiEventController.cpp
void JvmtiEventControllerPrivate::set_event_callbacks(JvmtiEnvBase *env,
const jvmtiEventCallbacks* callbacks,
jint size_of_callbacks) {
{- -------------------------------------------
(1) (assert)
---------------------------------------- -}
assert(Threads::number_of_threads() == 0 || JvmtiThreadState_lock->is_locked(), "sanity check");
{- -------------------------------------------
(1) (トレース出力)
---------------------------------------- -}
EC_TRACE(("JVMTI [*] # set event callbacks"));
{- -------------------------------------------
(1) JvmtiEnvBase::set_event_callbacks() を呼んで, callbacks 引数で指定されたコールバック関数を登録する.
---------------------------------------- -}
env->set_event_callbacks(callbacks, size_of_callbacks);
{- -------------------------------------------
(1) 現在登録されているコールバック関数を全て調査し, それら全部の和集合を表す bit mask を作って
env->env_event_enable()->_event_callback_enabled() にセットする.
(これは, 「env 引数で指定された JvmtiEnvBase オブジェクト中の JvmtiEnvEventEnable オブジェクトの
_event_callback_enabled フィールドに格納されている JvmtiEventEnabled オブジェクト」, ということ.)
---------------------------------------- -}
jlong enabled_bits = 0;
for (int ei = JVMTI_MIN_EVENT_TYPE_VAL; ei <= JVMTI_MAX_EVENT_TYPE_VAL; ++ei) {
jvmtiEvent evt_t = (jvmtiEvent)ei;
if (env->has_callback(evt_t)) {
enabled_bits |= JvmtiEventEnabled::bit_for(evt_t);
}
}
env->env_event_enable()->_event_callback_enabled.set_bits(enabled_bits);
{- -------------------------------------------
(1) JvmtiEventControllerPrivate::recompute_enabled() を呼んで,
"truly enabled event" 情報を更新する.
---------------------------------------- -}
recompute_enabled();
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.