hotspot/src/share/vm/prims/jvmtiEnv.cpp
// Threads_lock NOT held
// thread - NOT pre-checked
// data_ptr - pre-checked for NULL
jvmtiError
JvmtiEnv::GetThreadLocalStorage(jthread thread, void** data_ptr) {
{- -------------------------------------------
(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.