hotspot/src/share/vm/prims/jvmtiEventController.cpp
// For the specified env and thread: compute the currently truly enabled events
// set external state accordingly. Only thread-filtered events are included.
jlong
JvmtiEventControllerPrivate::recompute_env_thread_enabled(JvmtiEnvThreadState* ets, JvmtiThreadState* state) {
{- -------------------------------------------
(1) (変数宣言など)
---------------------------------------- -}
JvmtiEnv *env = ets->get_env();
{- -------------------------------------------
(1) 現在の truly enabled event 設定を取得
---------------------------------------- -}
jlong was_enabled = ets->event_enable()->_event_enabled.get_bits();
{- -------------------------------------------
(1) (以降で, 新しい truly enabled event を計算する)
---------------------------------------- -}
{- -------------------------------------------
(1) まず,
「ets 引数が表す JvmtiEnvThreadState 内または ets に対応する JvmtiEnv (env 変数) 内で
ユーザーが有効化しているイベント通知種別であり,
かつ callback も設定されており, かつ thread filtered event であるもの」
を表す bit mask を作る
---------------------------------------- -}
jlong now_enabled = THREAD_FILTERED_EVENT_BITS &
env->env_event_enable()->_event_callback_enabled.get_bits() &
(env->env_event_enable()->_event_user_enabled.get_bits() |
ets->event_enable()->_event_user_enabled.get_bits());
{- -------------------------------------------
(1.1) ただし, frame pops と field watchs に関しては, 監視対象が一つも設定されてなければ bit mask からは外す.
---------------------------------------- -}
// for frame pops and field watchs, computed enabled state
// is only true if an event has been requested
if (!ets->has_frame_pops()) {
now_enabled &= ~FRAME_POP_BIT;
}
if (*((int *)JvmtiExport::get_field_access_count_addr()) == 0) {
now_enabled &= ~FIELD_ACCESS_BIT;
}
if (*((int *)JvmtiExport::get_field_modification_count_addr()) == 0) {
now_enabled &= ~FIELD_MODIFICATION_BIT;
}
{- -------------------------------------------
(1.1) また, phase が JVMTI_PHASE_DEAD であれば
(この状態ではもうイベント通知は許可されないので)
bit mask から要素を全部外す(空にする).
---------------------------------------- -}
switch (JvmtiEnv::get_phase()) {
case JVMTI_PHASE_DEAD:
// no events allowed when dead
now_enabled = 0;
break;
}
{- -------------------------------------------
(1) もし新しい truly enabled event が古いものと異なれば, 以下の if ブロック内でその変更を反映させる処理を行う.
---------------------------------------- -}
// if anything changed do update
if (now_enabled != was_enabled) {
{- -------------------------------------------
(1.1) 新しい bit mask を ets->event_enable()->_event_enabled に記録しておく.
(これは, 「ets 引数で指定された JvmtiEnvThreadState オブジェクト中の JvmtiEnvThreadEventEnable オブジェクトの
_event_enabled フィールドに格納されている JvmtiEventEnabled オブジェクト」, ということ.)
---------------------------------------- -}
// will we really send these events to this thread x env
ets->event_enable()->_event_enabled.set_bits(now_enabled);
{- -------------------------------------------
(1.1) もし single step か breakpoint が変わっていたのであれば,
JvmtiEnvThreadState::reset_current_location() を呼んで ...#TODO
---------------------------------------- -}
// If the enabled status of the single step or breakpoint events changed,
// the location status may need to change as well.
jlong changed = now_enabled ^ was_enabled;
if (changed & SINGLE_STEP_BIT) {
ets->reset_current_location(JVMTI_EVENT_SINGLE_STEP, (now_enabled & SINGLE_STEP_BIT) != 0);
}
if (changed & BREAKPOINT_BIT) {
ets->reset_current_location(JVMTI_EVENT_BREAKPOINT, (now_enabled & BREAKPOINT_BIT) != 0);
}
{- -------------------------------------------
(1) (トレース出力)
---------------------------------------- -}
trace_changed(state, now_enabled, changed);
}
{- -------------------------------------------
(1) 新しい truly enabled event をリターンする
---------------------------------------- -}
return now_enabled;
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.