Top


定義場所(file name)

hotspot/src/share/vm/prims/jvmtiEventController.cpp

説明(description)

// For the specified thread: compute the currently truly enabled events
// set external state accordingly.  Only thread-filtered events are included.

名前(function name)

jlong
JvmtiEventControllerPrivate::recompute_thread_enabled(JvmtiThreadState *state) {

本体部(body)

  {- -------------------------------------------
  (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.