hotspot/src/share/vm/prims/jvmtiEnv.cpp
// Threads_lock NOT held
// thread - NOT pre-checked
// proc - pre-checked for NULL
// arg - NULL is a valid value, must be checked
jvmtiError
JvmtiEnv::RunAgentThread(jthread thread, jvmtiStartFunction proc, const void* arg, jint priority) {
{- -------------------------------------------
(1) もし thread 引数の値がおかしければ, ここでリターン(JVMTI_ERROR_INVALID_THREAD)
---------------------------------------- -}
oop thread_oop = JNIHandles::resolve_external_guard(thread);
if (thread_oop == NULL || !thread_oop->is_a(SystemDictionary::Thread_klass())) {
return JVMTI_ERROR_INVALID_THREAD;
}
{- -------------------------------------------
(1) もし priority 引数の値がおかしければ, ここでリターン(JVMTI_ERROR_INVALID_PRIORITY)
---------------------------------------- -}
if (priority < JVMTI_THREAD_MIN_PRIORITY || priority > JVMTI_THREAD_MAX_PRIORITY) {
return JVMTI_ERROR_INVALID_PRIORITY;
}
{- -------------------------------------------
(1) (変数宣言など)
---------------------------------------- -}
//Thread-self
JavaThread* current_thread = JavaThread::current();
Handle thread_hndl(current_thread, thread_oop);
{
{- -------------------------------------------
(1) (以降の処理は Threads_lock で排他した状態で行う)
---------------------------------------- -}
MutexLocker mu(Threads_lock); // grab Threads_lock
{- -------------------------------------------
(1) 新しい JvmtiAgentThread オブジェクトを生成する.
(もしメモリ確保や OSThread の生成に失敗したら, ここでリターン(JVMTI_ERROR_OUT_OF_MEMORY))
---------------------------------------- -}
JvmtiAgentThread *new_thread = new JvmtiAgentThread(this, proc, arg);
// At this point it may be possible that no osthread was created for the
// JavaThread due to lack of memory.
if (new_thread == NULL || new_thread->osthread() == NULL) {
if (new_thread) delete new_thread;
return JVMTI_ERROR_OUT_OF_MEMORY;
}
{- -------------------------------------------
(1) java_lang_Thread::set_thread() を呼んで,
thread 引数で指定された java.lang.Thread オブジェクトの eetop フィールドに
生成した JvmtiAgentThread オブジェクトをセットしておく.
(See: [here](no30595cP.html) for details)
---------------------------------------- -}
java_lang_Thread::set_thread(thread_hndl(), new_thread);
{- -------------------------------------------
(1) java_lang_Thread::set_priority() を呼んで, 処理対象のスレッドの優先度を priority 引数の値に設定する.
---------------------------------------- -}
java_lang_Thread::set_priority(thread_hndl(), (ThreadPriority)priority);
{- -------------------------------------------
(1) java_lang_Thread::set_daemon() を呼んで, 処理対象のスレッドをデーモンスレッドにする
---------------------------------------- -}
java_lang_Thread::set_daemon(thread_hndl());
{- -------------------------------------------
(1) JavaThread::set_thread() を呼んで,
生成した JvmtiAgentThread の threadObj フィールドに
処理対象の java.lang.Thread オブジェクトをセットしておく.
---------------------------------------- -}
new_thread->set_threadObj(thread_hndl());
{- -------------------------------------------
(1) Threads::add() を呼んで, 生成した JvmtiAgentThread を Threads::_thread_list に追加する.
---------------------------------------- -}
Threads::add(new_thread);
{- -------------------------------------------
(1) 生成した JvmtiAgentThread の実行を開始させる.
---------------------------------------- -}
Thread::start(new_thread);
{- -------------------------------------------
(1) (Threads_lock で排他している区間はここまで)
---------------------------------------- -}
} // unlock Threads_lock
{- -------------------------------------------
(1) リターン
---------------------------------------- -}
return JVMTI_ERROR_NONE;
} /* end RunAgentThread */
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.