Up Top

Thread の一時停止処理の枠組み (Safepoint 処理) : 停止される側の処理 : ネイティブコードの処理中 : JNI Functions の呼び出し時 (JNI_*)


概要(Summary)

JNI 関数の呼び出し時には, 明示的に SafepointSynchronize::_state のチェックが行われる. この時点で Safepoint が開始されていた場合, そのスレッドはその場で停止する.

より具体的に言うと, JNI 関数は定義時に以下のマクロを用いて定義されている (See: here for details).

これらのマクロが生成するコードから ThreadInVMfromNative のコンストラクタ/デストラクタが呼び出され, その中で SafepointSynchronize::_state の値を確認している.

備考(Notes)

非常に簡単な JNI 関数用に, Safepoint チェックを行わない JNI_LEAF というマクロも用意されている.

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

JNI_ENTRY マクロ ~ JNI_END マクロ

JNI_ENTRY マクロ
-> JNI_ENTRY_NO_PRESERVE マクロ
   -> ThreadInVMfromNative::ThreadInVMfromNative()
      -> (See: here for details)
JNI_END マクロ
(JNI_ENTRY マクロで宣言されていた ThreadInVMfromNative のデストラクタが呼ばれる)
-> ThreadInVMfromNative::~ThreadInVMfromNative()
   -> (See: here for details)

JNI_QUICK_ENTRY マクロ ~ JNI_END マクロ

JNI_QUICK_ENTRY マクロ
-> ThreadInVMfromNative::ThreadInVMfromNative()
   -> (See: here for details)
JNI_END マクロ
-> (同上)

JNI_LEAF マクロ ~ JNI_END マクロ

(Safepoint チェック処理はない)

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

JNI_ENTRY マクロ

See: here for details

JNI_ENTRY_NO_PRESERVE マクロ

See: here for details

__ENTRY マクロ

See: here for details

JNI_END マクロ

See: here for details

JNI_QUICK_ENTRY マクロ

See: here for details

__QUICK_ENTRY マクロ

See: here for details

JNI_LEAF マクロ

See: here for details

__LEAF マクロ

See: here for details


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