CVMI 関数の呼び出し時には, 明示的に SafepointSynchronize::_state のチェックが行われる. この時点で Safepoint が開始されていた場合, そのスレッドはその場で停止する.
より具体的に言うと, CVMI 関数は定義時に以下のマクロを用いて定義されている (See: ...).
これらのマクロが生成するコードから ThreadInVMfromNative のコンストラクタ/デストラクタが呼び出され, その中で SafepointSynchronize::_state の値を確認している.
非常に簡単な CVMI 関数用に, Safepoint チェックを行わない JVM_LEAF というマクロも用意されている.
JVM_ENTRY マクロ -> ThreadInVMfromNative::ThreadInVMfromNative() -> (See: here for details)
JVM_END マクロ (JVM_ENTRY マクロで宣言されていた ThreadInVMfromNative のデストラクタが呼ばれる) -> ThreadInVMfromNative::~ThreadInVMfromNative() -> (See: here for details)
JVM_ENTRY_NO_ENV マクロ -> ThreadInVMfromNative::ThreadInVMfromNative() -> (See: here for details)
JVM_END マクロ -> (同上)
JVM_ENTRY_NO_ENV マクロ -> ThreadInVMfromNative::ThreadInVMfromNative() -> (See: here for details)
JVM_END マクロ -> (同上)
(Safepoint チェック処理はない)
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
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.