Top


定義場所(file name)

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

説明(description)

// event_thread - NULL is a valid value, must be checked

名前(function name)

jvmtiError
JvmtiEnv::SetEventNotificationMode(jvmtiEventMode mode, jvmtiEvent event_type, jthread event_thread,   ...) {

本体部(body)

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