Top


定義場所(file name)

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

名前(function name)

jint
JvmtiExport::get_jvmti_interface(JavaVM *jvm, void **penv, jint version) {

本体部(body)

  {- -------------------------------------------
  (1) (変数宣言など)
      ---------------------------------------- -}

      // The JVMTI_VERSION_INTERFACE_JVMTI part of the version number
      // has already been validated in JNI GetEnv().
      int major, minor, micro;

      // micro version doesn't matter here (yet?)
      decode_version_values(version, &major, &minor, &micro);

  {- -------------------------------------------
  (1) バージョンが 1.0.*, 1.1.*, 1.2.* 以外の場合は,
      サポートしていないバージョンなので, ここでリターン (JNI_EVERSION)
      ---------------------------------------- -}

      switch (major) {
        case 1:
          switch (minor) {
            case 0:  // version 1.0.<micro> is recognized
            case 1:  // version 1.1.<micro> is recognized
            case 2:  // version 1.2.<micro> is recognized
              break;

            default:
              return JNI_EVERSION;  // unsupported minor version number
          }
          break;
        default:
          return JNI_EVERSION;  // unsupported major version number
      }

  {- -------------------------------------------
  (1) JVMTI の phase が JVMTI_PHASE_LIVE または JVMTI_PHASE_ONLOAD であれば, 
      JvmtiEnv::create_a_jvmti() で JvmtiEnv オブジェクトを生成し, 
      penv 引数で指定された箇所にセットする.

      (なお, JVMTI の phase が JVMTI_PHASE_LIVE の場合は, 
       ThreadInVMfromNative と __ENTRY() マクロで VM 内に遷移してから処理を実行する.
       (この処理は JVM_ENTRY() 等での処理とほぼ同じ))

      (また, JVMTI の phase が上記以外の場合は, エラーをリターンする(JNI_EDETACHED).
       この場合, penv 引数で指す箇所には NULL がセットされる)
      ---------------------------------------- -}

      if (JvmtiEnv::get_phase() == JVMTI_PHASE_LIVE) {
        JavaThread* current_thread = (JavaThread*) ThreadLocalStorage::thread();
        // transition code: native to VM
        ThreadInVMfromNative __tiv(current_thread);
        __ENTRY(jvmtiEnv*, JvmtiExport::get_jvmti_interface, current_thread)
        debug_only(VMNativeEntryWrapper __vew;)

        JvmtiEnv *jvmti_env = JvmtiEnv::create_a_jvmti(version);
        *penv = jvmti_env->jvmti_external();  // actual type is jvmtiEnv* -- not to be confused with JvmtiEnv*
        return JNI_OK;

      } else if (JvmtiEnv::get_phase() == JVMTI_PHASE_ONLOAD) {
        // not live, no thread to transition
        JvmtiEnv *jvmti_env = JvmtiEnv::create_a_jvmti(version);
        *penv = jvmti_env->jvmti_external();  // actual type is jvmtiEnv* -- not to be confused with JvmtiEnv*
        return JNI_OK;

      } else {
        // Called at the wrong time
        *penv = NULL;
        return JNI_EDETACHED;
      }
    }

This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.