hotspot/src/share/vm/prims/jvmtiExport.cpp
jint
JvmtiExport::get_jvmti_interface(JavaVM *jvm, void **penv, jint version) {
{- -------------------------------------------
(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, µ);
{- -------------------------------------------
(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.