hotspot/src/share/vm/prims/jvmtiEnv.cpp
// Threads_lock NOT held, java_thread not protected by lock
// java_thread - pre-checked
// count_ptr - pre-checked for NULL
jvmtiError
JvmtiEnv::GetFrameCount(JavaThread* java_thread, jint* count_ptr) {
{- -------------------------------------------
(1) (変数宣言など)
---------------------------------------- -}
jvmtiError err = JVMTI_ERROR_NONE;
{- -------------------------------------------
(1) JvmtiThreadState::state_for() を呼んで,
処理対象のスレッド(java_thread)に対応する JvmtiThreadState を取得する.
(もし対象のスレッドが JvmtiThreadState を持っていなければ, この中で確保処理が行われる)
(なお, スレッドが既に死んでいる場合(もしくは確保処理が失敗した場合)は, ここでリターン(JVMTI_ERROR_THREAD_NOT_ALIVE エラー))
---------------------------------------- -}
// retrieve or create JvmtiThreadState.
JvmtiThreadState* state = JvmtiThreadState::state_for(java_thread);
if (state == NULL) {
return JVMTI_ERROR_THREAD_NOT_ALIVE;
}
{- -------------------------------------------
(1) (変数宣言など)
---------------------------------------- -}
uint32_t debug_bits = 0;
{- -------------------------------------------
(1) java_thread 引数で指定されたスレッドのスタックフレーム数を取得する.
取得方法は以下の2通り.
* 対象のスレッドがサスペンドしている場合:
JvmtiEnvBase::get_frame_count() で取得.
* 対象のスレッドがサスペンドしていない場合:
VM_GetFrameCount で取得.
---------------------------------------- -}
if (is_thread_fully_suspended(java_thread, true, &debug_bits)) {
err = get_frame_count(state, count_ptr);
} else {
// get java stack frame count at safepoint.
VM_GetFrameCount op(this, state, count_ptr);
VMThread::execute(&op);
err = op.result();
}
{- -------------------------------------------
(1) リターン
---------------------------------------- -}
return err;
} /* end GetFrameCount */
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.