hotspot/src/share/vm/prims/jvmtiEventController.cpp
// For the specified thread: compute the currently truly enabled events
// set external state accordingly. Only thread-filtered events are included.
jlong
JvmtiEventControllerPrivate::recompute_thread_enabled(JvmtiThreadState *state) {
{- -------------------------------------------
(1) state 引数が NULL の場合は, 何もすることがないので, ここでリターン.
---------------------------------------- -}
if (state == NULL) {
// associated JavaThread is exiting
return (jlong)0;
}
{- -------------------------------------------
(1) 現在の truly enabled event 設定を取得
---------------------------------------- -}
jlong was_any_env_enabled = state->thread_event_enable()->_event_enabled.get_bits();
{- -------------------------------------------
(1) (変数宣言など)
(any_env_enabled は新しい truly enabled event の計算結果を格納する変数)
---------------------------------------- -}
jlong any_env_enabled = 0;
{- -------------------------------------------
(1) 新しい truly enabled event を計算する.
(全ての JvmtiEnvThreadState をたどり, JvmtiEventControllerPrivate::recompute_env_thread_enabled() を呼び出す.
そして, その結果を any_env_enabled に足し込んでいく.)
---------------------------------------- -}
{
// This iteration will include JvmtiEnvThreadStates whoses environments
// have been disposed. These JvmtiEnvThreadStates must not be filtered
// as recompute must be called on them to disable their events,
JvmtiEnvThreadStateIterator it(state);
for (JvmtiEnvThreadState* ets = it.first(); ets != NULL; ets = it.next(ets)) {
any_env_enabled |= recompute_env_thread_enabled(ets, state);
}
}
{- -------------------------------------------
(1) もし新しい truly enabled event が古いものと異なれば,
以下の if ブロック内でその変更を反映させる処理を行う.
---------------------------------------- -}
if (any_env_enabled != was_any_env_enabled) {
{- -------------------------------------------
(1.1) 新しい bit mask を state->thread_event_enable()->_event_enabled 内に記録しておく
(これは, 「state 引数で指定された JvmtiThreadState オブジェクト中の JvmtiThreadEventEnable オブジェクトの
_event_enabled フィールドに格納されている JvmtiEventEnabled オブジェクト」, ということ.)
---------------------------------------- -}
// mark if event is truly enabled on this thread in any environment
state->thread_event_enable()->_event_enabled.set_bits(any_env_enabled);
{- -------------------------------------------
(1.1) もし変更されたものに INTERP_EVENT_BITS の bit が混じっており,
しかもそれが現在の interp_only_mode 設定と違っていれば,
interp_only_mode の on/off を行う (See: [here](no3059eFS.html) for details).
なお, on/off は
JvmtiEventControllerPrivate::enter_interp_only_mode() または
JvmtiEventControllerPrivate::leave_interp_only_mode() を
呼び出すことで行う.
---------------------------------------- -}
// compute interp_only mode
bool should_be_interp = (any_env_enabled & INTERP_EVENT_BITS) != 0;
bool is_now_interp = state->is_interp_only_mode();
if (should_be_interp != is_now_interp) {
if (should_be_interp) {
enter_interp_only_mode(state);
} else {
leave_interp_only_mode(state);
}
}
{- -------------------------------------------
(1.1) ?? #TODO (thread local な should_post_on_exceptions は何に使われるフィールド??)
---------------------------------------- -}
// update the JavaThread cached value for thread-specific should_post_on_exceptions value
bool should_post_on_exceptions = (any_env_enabled & SHOULD_POST_ON_EXCEPTIONS_BITS) != 0;
state->set_should_post_on_exceptions(should_post_on_exceptions);
}
{- -------------------------------------------
(1) 新しい truly enabled event をリターンする
---------------------------------------- -}
return any_env_enabled;
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.