Top


定義場所(file name)

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

説明(description)

// Threads_lock NOT held, java_thread not protected by lock
// java_thread - pre-checked
// count_ptr - pre-checked for NULL

名前(function name)

jvmtiError
JvmtiEnv::GetFrameCount(JavaThread* java_thread, jint* count_ptr) {

本体部(body)

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