Up Top

Thread の一時停止処理の枠組み (Safepoint 処理) : 停止される側の処理 : スレッドの状態遷移処理


概要(Summary)

safepoint 停止処理は, 多くの場合, スレッドの状態が遷移する際に行われる (つまり, 何らかの状態遷移が起こった際に Safepoint 処理が開始されていれば, そのスレッドは停止する).

スレッドの状態は JavaThreadState で表現されており, 以下のクラスがその遷移処理を担当している (これらのクラスのコンストラクタとデストラクタで遷移処理が行われる).

備考(Notes)

これらのクラスは, 内部的には ThreadStateTransition クラスの以下のメソッドを使用している.

処理の流れ (概要)(Execution Flows : Summary)

ThreadInVMfromJava の処理

コンストラクタ

ThreadInVMfromJava::ThreadInVMfromJava()
-> (1) JavaThreadState を _thread_in_vm に変更 (この場合は, 中間的な状態を経ることなく直接遷移)
       -> ThreadStateTransition::trans_from_java()
          -> ThreadStateTransition::transition_from_java()

デストラクタ

ThreadInVMfromJava::~ThreadInVMfromJava()
-> (1) JavaThreadState を _thread_in_Java に戻す. (Safepoint が始まっていればここでブロックする)
       -> ThreadStateTransition::trans()
          -> ThreadStateTransition::transition()
             -> (1) JavaThreadState を引数で指定された値(この場合は _thread_in_vm_trans) に変更
                (2) メモリアクセスの順序づけを行う
                    -> OrderAccess::fence() or os::write_memory_serialize_page() が生成したコード
                (3) もし Safepoint が開始されていたらブロックする
                    -> SafepointSynchronize::block()
                (4) JavaThreadState を引数で指定された値(この場合は _thread_in_Java) に変更
   (1) 処理対象のスレッドが例外を出していたりサスペンドされたりしていないかチェックし, もし何か起きていたら対処する.
       -> JavaThread::has_special_runtime_exit_condition()
       -> JavaThread::handle_special_runtime_exit_condition()

ThreadInVMfromUnknown の処理

コンストラクタ

ThreadInVMfromUnknown::ThreadInVMfromUnknown()
-> ThreadStateTransition::transition_from_native()    
   (<= ただし, カレントスレッドが JavaThread であり, かつ _thread_in_native の場合にのみこの呼び出しを行う. そうでなければ何もしない)
   -> (1) JavaThreadState を _thread_in_native_trans に変更
      (1) メモリアクセスの順序づけを行う
          -> OrderAccess::fence() or InterfaceSupport::serialize_memory() が生成したコード
      (1) SafepointSynchronize::_state の値を確認し, Safepoint が始まっていればブロックする
          -> SafepointSynchronize::do_call_back()
          -> JavaThread::check_safepoint_and_suspend_for_native_trans()
             -> SafepointSynchronize::block()
      (1) JavaThreadState を引数で指定された値(この場合は _thread_in_vm) に変更

デストラクタ

ThreadInVMfromUnknown::~ThreadInVMfromUnknown()
-> ThreadStateTransition::transition_and_fence()   
   (<= ただし, コンストラクタで状態変更を行った場合のみ, この呼び出しを行う. そうでなければ何もしない)
   -> (1) JavaThreadState を引数で指定された値(この場合は _thread_in_vm_trans) に変更
      (2) メモリアクセスの順序づけを行う
          -> OrderAccess::fence() or InterfaceSupport::serialize_memory() が生成したコード
      (3) もし Safepoint が開始されていたらブロックする
          -> SafepointSynchronize::block()
      (4) JavaThreadState を引数で指定された値(この場合は _thread_in_native) に変更

ThreadInVMfromNative の処理

コンストラクタ

ThreadInVMfromNative::ThreadInVMfromNative()
-> ThreadStateTransition::trans_from_native()
   -> (1) JavaThreadState を _thread_in_vm に変更
          -> ThreadStateTransition::transition_from_native()
             -> (上述)
                (この場合は, まず _thread_in_native_trans に変更した後,
                Safepoint チェックを経て, 最終的に _thread_in_vm に変更される)

デストラクタ

ThreadInVMfromNative::~ThreadInVMfromNative()
-> ThreadStateTransition::trans_and_fence()
   -> (1) JavaThreadState を _thread_in_native に変更
          -> ThreadStateTransition::transition_and_fence()
             -> (上述)
                (この場合は, まず _thread_in_vm_trans に変更した後,
                Safepoint チェックを経て, 最終的に _thread_in_native に変更される)

ThreadToNativeFromVM の処理

コンストラクタ

ThreadToNativeFromVM::ThreadToNativeFromVM()
-> (1) スタックフレームを辿れるようにしておく
       -> JavaFrameAnchor::make_walkable()
   (1) JavaThreadState を _thread_in_native に変更.
       -> ThreadStateTransition::trans_and_fence()
          -> (上述)
             (この場合は, まず _thread_in_vm_trans に変更した後,
             Safepoint チェックを経て, 最終的に _thread_in_native に変更される)
   (1) 処理対象のスレッドが例外を出していたりサスペンドされたりしていないかチェックし, もし何か起きていたら対処する.
       -> JavaThread::has_special_runtime_exit_condition()
       -> JavaThread::handle_special_runtime_exit_condition()  (<= 引数を false で呼び出す)

デストラクタ

ThreadToNativeFromVM::~ThreadToNativeFromVM()
-> (1) JavaThreadState を _thread_in_vm に変更
       -> ThreadStateTransition::transition_from_native()
          -> (上述)
             (この場合は, まず _thread_in_native_trans に変更した後,
              Safepoint チェックを経て, 最終的に _thread_in_vm に変更される)

ThreadBlockInVM の処理

コンストラクタ

ThreadBlockInVM::ThreadBlockInVM()
-> (1) スタックフレームを辿れるようにしておく
       -> JavaFrameAnchor::make_walkable()
   (1) JavaThreadState を _thread_blocked に変更
       -> ThreadStateTransition::trans_and_fence()
          -> (上述)
             (この場合は, まず _thread_in_vm_trans に変更した後,
             Safepoint チェックを経て, 最終的に _thread_blocked に変更される)

デストラクタ

ThreadBlockInVM::~ThreadBlockInVM()
-> (1) JavaThreadState を _thread_in_vm に変更
       -> ThreadStateTransition::trans_and_fence()
          -> (上述)
             (この場合は, まず _thread_blocked_trans に変更した後,
             Safepoint チェックを経て, 最終的に _thread_in_vm に変更される)

ThreadInVMfromJavaNoAsyncException の処理

コンストラクタ

-> ThreadInVMfromJavaNoAsyncException::ThreadInVMfromJavaNoAsyncException()
   (1) JavaThreadState を _thread_in_vm に変更 (この場合は, 中間的な状態を経ることなく直接遷移)
       -> ThreadStateTransition::trans_from_java()
          -> (上述)

デストラクタ

-> ThreadInVMfromJavaNoAsyncException::~ThreadInVMfromJavaNoAsyncException()
   (1) JavaThreadState を _thread_in_Java に戻す. (Safepoint が始まっていればここでブロックする)
       -> ThreadStateTransition::trans()
          -> (上述)
             (この場合は, まず _thread_in_vm_trans に変更した後,
             Safepoint チェックを経て, 最終的に _thread_in_Java に変更される)
   (1) 処理対象のスレッドが例外を出していたりサスペンドされたりしていないかチェックし, もし何か起きていたら対処する.
       -> JavaThread::has_special_runtime_exit_condition()
       -> JavaThread::handle_special_runtime_exit_condition()  (<= 引数を false で呼び出す)

処理の流れ (詳細)(Execution Flows : Details)

ThreadInVMfromJava::ThreadInVMfromJava()

See: here for details

ThreadStateTransition::trans_from_java()

See: here for details

ThreadStateTransition::transition_from_java()

See: here for details

JavaThread::set_thread_state()

See: here for details

ThreadInVMfromJava::~ThreadInVMfromJava()

See: here for details

ThreadStateTransition::trans()

See: here for details

ThreadStateTransition::transition()

See: here for details

os::write_memory_serialize_page()

See: here for details

JavaThread::has_special_runtime_exit_condition()

See: here for details

JavaThread::handle_special_runtime_exit_condition()

See: here for details

ThreadInVMfromUnknown::ThreadInVMfromUnknown()

See: here for details

ThreadInVMfromUnknown::~ThreadInVMfromUnknown()

See: here for details

ThreadInVMfromNative::ThreadInVMfromNative()

See: here for details

ThreadStateTransition::trans_from_native()

See: here for details

ThreadStateTransition::transition_from_native()

See: here for details

InterfaceSupport::serialize_memory() (Linux の場合)

See: here for details

InterfaceSupport::serialize_memory() (Solaris の場合)

See: here for details

InterfaceSupport::serialize_memory() (Windows の場合)

See: here for details

os::win32::serialize_fault_filter()

See: here for details

JavaThread::is_suspend_after_native()

See: here for details

JavaThread::check_safepoint_and_suspend_for_native_trans()

See: here for details

ThreadInVMfromNative::~ThreadInVMfromNative()

See: here for details

ThreadStateTransition::trans_and_fence()

See: here for details

ThreadStateTransition::transition_and_fence()

See: here for details

ThreadToNativeFromVM::ThreadToNativeFromVM()

See: here for details

ThreadToNativeFromVM::~ThreadToNativeFromVM()

See: here for details

ThreadBlockInVM::ThreadBlockInVM()

See: here for details

ThreadBlockInVM::~ThreadBlockInVM()

See: here for details

ThreadInVMfromJavaNoAsyncException::ThreadInVMfromJavaNoAsyncException()

See: here for details

ThreadInVMfromJavaNoAsyncException::~ThreadInVMfromJavaNoAsyncException()

See: here for details


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