Top


定義場所(file name)

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

説明(description)

// Threads_lock NOT held
// thread - NOT pre-checked
// data_ptr - pre-checked for NULL

名前(function name)

jvmtiError
JvmtiEnv::GetThreadLocalStorage(jthread thread, void** data_ptr) {

本体部(body)

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

      JavaThread* current_thread = JavaThread::current();

  {- -------------------------------------------
  (1) (以下の処理は thread 引数の値に応じて 2通り. 
       NULL の場合はカレントスレッドに対する処理. そうでなければ指定されたスレッドに対する処理)
      ---------------------------------------- -}

  {- -------------------------------------------
  (1) thread 引数が NULL の場合は, 条件に応じて以下のどちらかを data_ptr 引数が指す箇所にセットする.
      * カレントスレッドが JvmtiThreadState を持っていない場合:
        (そもそも取得する値がないので) NULL をセット.
      * 〃 JvmtiThreadState を持っている場合:
        JvmtiEnvThreadState::get_agent_thread_local_storage_data() で
        JvmtiEnvThreadState 内から取得した値をセット.
      ---------------------------------------- -}

      if (thread == NULL) {
        JvmtiThreadState* state = current_thread->jvmti_thread_state();
        *data_ptr = (state == NULL) ? NULL :
          state->env_thread_state(this)->get_agent_thread_local_storage_data();

  {- -------------------------------------------
  (1) thread 引数が NULL でない場合は, 条件に応じて以下のどれかを実行する.
      * thread 引数の指す先が NULL の場合:
        エラー値をリターン(JVMTI_ERROR_INVALID_THREAD)
      * thread 引数の指す先が Thread クラスに属していないオブジェクトの場合:
        エラー値をリターン(JVMTI_ERROR_INVALID_THREAD)
      * thread 引数の指す先が JavaThread ではない場合:
        エラー値をリターン(JVMTI_ERROR_INVALID_THREAD)

      * 上記以外の場合:
        条件に応じて以下のどちらかを data_ptr 引数が指す箇所にセットする.
        * thread 引数で指定されたスレッドが JvmtiThreadState を持っていない場合:
          (そもそも取得する値がないので) NULL をセット.
        * 〃 JvmtiThreadState を持っている場合:
          JvmtiEnvThreadState::get_agent_thread_local_storage_data() で
          JvmtiEnvThreadState 内から取得した値をセット.

      (なお, 以上の処理は ThreadInVMfromNative と __ENTRY() マクロで VM 内に遷移してから処理を実行する.
       (この処理は JVM_ENTRY() 等での処理とほぼ同じ))
      ---------------------------------------- -}

      } else {

        // jvmti_GetThreadLocalStorage is "in native" and doesn't transition
        // the thread to _thread_in_vm. However, when the TLS for a thread
        // other than the current thread is required we need to transition
        // from native so as to resolve the jthread.

        ThreadInVMfromNative __tiv(current_thread);
        __ENTRY(jvmtiError, JvmtiEnv::GetThreadLocalStorage , current_thread)
        debug_only(VMNativeEntryWrapper __vew;)

        oop thread_oop = JNIHandles::resolve_external_guard(thread);
        if (thread_oop == NULL) {
          return JVMTI_ERROR_INVALID_THREAD;
        }
        if (!thread_oop->is_a(SystemDictionary::Thread_klass())) {
          return JVMTI_ERROR_INVALID_THREAD;
        }
        JavaThread* java_thread = java_lang_Thread::thread(thread_oop);
        if (java_thread == NULL) {
          return JVMTI_ERROR_THREAD_NOT_ALIVE;
        }
        JvmtiThreadState* state = java_thread->jvmti_thread_state();
        *data_ptr = (state == NULL) ? NULL :
          state->env_thread_state(this)->get_agent_thread_local_storage_data();
      }

  {- -------------------------------------------
  (1) リターン
      ---------------------------------------- -}

      return JVMTI_ERROR_NONE;
    } /* end GetThreadLocalStorage */

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