InterpreterRuntime の関数の中で InterpreterRuntime 外から呼び出される可能性があるもの (= InterpreterRuntime 外からの entry point になるもの) については, 呼び出し時に明示的に SafepointSynchronize::_state のチェックが行われる. この時点で Safepoint が開始されていた場合, そのスレッドはその場で停止する.
より具体的に言うと, 上記のような関数は定義時に以下のマクロを用いて定義されている.
これらのマクロが生成するコードから ThreadInVMfromJava のコンストラクタ/デストラクタが呼び出され, その中で SafepointSynchronize::_state の値を確認している.
非常に簡単な InterpreterRuntime の関数用に, Safepoint チェックを行わない IRT_LEAF というマクロも用意されている.
また, InterpreterRuntime::monitorenter() と InterpreterRuntime::monitorexit() 用に IRT_ENTRY_NO_ASYNC というマクロも用意されている. IRT_ENTRY マクロとの違いは, ThreadInVMfromJava ではなく ThreadInVMfromJavaNoAsyncException を用いる点 (これは, JavaThread::handle_special_runtime_exit_condition() 内での asynchronous exception 用の処理を省略した高速版).
(ついでに IRT_ENTRY_FOR_NMETHOD というマクロも存在しているが, これは使用箇所が見当たらない...#TODO)
IRT_ENTRY マクロ -> ThreadInVMfromJava::ThreadInVMfromJava() -> (See: here for details)
IRT_END マクロ (IRT_ENTRY マクロで宣言されていた ThreadInVMfromJava のデストラクタが呼ばれる) -> ThreadInVMfromJava::~ThreadInVMfromJava() -> (See: here for details)
(Safepoint チェック処理はない)
IRT_ENTRY_NO_ASYNC マクロ -> ThreadInVMfromJavaNoAsyncException::ThreadInVMfromJavaNoAsyncException() -> (See: here for details)
IRT_END マクロ (IRT_ENTRY_NO_ASYNC マクロで宣言されていた ThreadInVMfromJavaNoAsyncException のデストラクタが呼ばれる) -> ThreadInVMfromJavaNoAsyncException::~ThreadInVMfromJavaNoAsyncException() -> (See: here for details)
IRT_ENTRY_FOR_NMETHOD マクロ -> ThreadInVMfromJavaNoAsyncException::ThreadInVMfromJavaNoAsyncException() -> (See: here for details)
IRT_END マクロ (IRT_ENTRY_FOR_NMETHOD マクロで宣言されていた ThreadInVMfromJavaNoAsyncException のデストラクタが呼ばれる) -> ThreadInVMfromJavaNoAsyncException::~ThreadInVMfromJavaNoAsyncException() -> (See: here for details)
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.