日本-日本語 |
|
|
|
OpenVMS マニュアル |
|
HP OpenVMS
|
目次 | 索引 |
C.1.6 モードに依存しない割り当て |
モードに依存しない割り当ての構文は次のとおりです。
EXE$KP_USER_ALLOC_KPB kpb, flags, param_size, *kpb_alloc, mem_stack_bytes, *memstk_alloc, rse_stack_bytes, *rsestk_alloc, *end_rtn |
C プロトタイプ
status = EXE$KP_USER_ALLOC_KPB( KPB_PPS kpb, int flags, int param_size, int (*kpb_alloc)(), int mem_stack_bytes, int(*memstk_alloc)(), int rse_stack_bytes, int(*rsestk_alloc)(), void(*end_rtn)()) |
パラメータ
フラグ | 説明 |
---|---|
KP$M_VEST | OpenVMS システム KPB。一般に,このフラグは設定する必要があります。 |
KP$M_SPLOCK | KPB の内部にスピンロック領域を割り当てます。 |
KP$M_DEBUG | KPB の内部にデバッグ領域を割り当てます。 |
KP$M_DEALLOC_AT_END | カーネル・プロセス・ルーチンの終了時に,KPB の割り当てを自動的に解除しなければならないことを指定します。 |
KP$M_SAVE_FP | (I64 のみ,Alpha では無視されます) 汎用レジスタだけなく,浮動小数点コンテキストも保存します。 I64 システムでの整数乗算や除算などの特定の演算は,浮動小数点演算を使用してインプリメントできます。これらの演算では,最小浮動小数点レジスタ・セットを使用しますが,定義では,これらは保存されるレジスタ・セットに含まれていません。アプリケーションで最小浮動小数点レジスタ・セットだけを使用する場合は,このビットを設定する必要はありません。アプリケーションで浮動小数点データを使用する場合は,このビットを設定して,スタック切り換えの前後で正しい浮動小数点コンテキストを保存する必要があります。 |
KP$M_SET_STACK_LIMITS | スタック切り換えのたびに $SETSTK_64 を呼び出します。条件処理では正確なスタック・リミット値が必要なため,プロセス・スコープ・アプリケーションは常にこのフラグを設定する必要があります。 |
status = alloc-routine (KPB_PQ kpb, const int stack_pages) |
割り当てルーチンは,ページ境界でアラインメントされたアドレス空間を割り当てるものと考えられます。厳密に必須というわけではありませんが,両端にアクセスされないガード・ページを配置することで,スタックを保護することを強くお勧めします。また,最小スタック・サイズは,少なくとも SYSGEN パラメータ KSTACKPAGES (グローバル・セル SGN$GL_KSTACKPAG) の値になるようにしてください。このように設定すると,アプリケーションを再コンパイルしなくても,スタック・サイズに関して特定の制御を行うことができます。また,I64 でのスタックの使い方は,従来のアーキテクチャとは大きく異なっているため,前に割り当てられていたスタック・サイズが適切でない可能性もあります。
メモリ・スタック割り当てルーチンでは,次の KPB フィールドを次のように設定する必要があります。
メモリ・スタック割り当てルーチンでは,次の KPB フィールドを次のように設定できます。
RSE スタック割り当てルーチンでは,次の KPB フィールドを次のように設定する必要があります。
RSE スタック割り当てルーチンでは,次の KPB フィールドを次のように設定できます。
void end_routine (KPB_PQ KPB, int status) |
KPB とスタックが割り当てられた後,KP ルーチンの状態を判断する 4 つのルーチンを使用できます。
KP ルーチンは,EXE$KP_START を呼び出すことで開始されます。 KP ルーチンは,実行中に EXE$KP_STALL_GENERAL を呼び出すことで,制御を放棄することができます。ストールされた KP ルーチンは,EXE$KP_RESTART を呼び出すことで再開できます。 KP ルーチンは,EXE$KP_END を明示的に呼び出すか,またはルーチンから戻ることで終了します。ルーチンから戻る場合は,KP サービスは EXE$KP_END を暗黙に呼び出します。
KP ルーチンが起動されると,現在の実行状態スレッドは現在のスタックに保存され,KP スタックがロードされ, KP ルーチンが呼び出されます。
KP ルーチンがストールされると,KP ルーチンのコンテキストは KP スタックに保存され,スタックは元のスタックに切り換えられ,メイン・ルーチンのコンテキストがスタックからロードされます。その結果,ストールによって,EXE$KP_START または EXE$KP_RESTART の最後の呼び出しから元のルーチンに戻ります。
KP ルーチンが再起動されると,現在のコンテキストは現在のスタックに保存され,スタックは KP ルーチンのスタックに切り換えられ,KP ルーチンのコンテキストがスタックから復元されます。 EXE$KP_STALL_GENERAL の最後の呼び出しから KP ルーチンに戻ります。
ストールと再開のシーケンスは 0 回以上実行できます。 KP ルーチンをあらかじめストールしなければならないわけではありません。ストールされたルーチンは,再開されるまでストールできません。実行中の KP ルーチンは,ストールされるまで再起動できません。完全にチェックする SYSTEM_PRIMITIVES.EXE で,これらのルールが適用されています。これらのルールに従わないと, KP ルーチンが実行されているモードに応じて, KP_INCONSTATE バグチェックが発生することがあります。
EXE$KP_END を明示的に呼び出すか,呼び出しルーチンに戻ることによって,KP ルーチンが終了する場合,現在のコンテキストは保存されず,スタックは切り換えられ,元のスレッド・コンテキストが復元されます。この時点で,DEALLOCATE_AT_END フラグが設定されているか (カーネル・モードのみ),終了ルーチンのアドレスが指定されている場合は,適切な処理が実行されます。 KP ルーチンを起動または再起動した呼び出しから,元のスレッドに戻ります。
図 C-1 は全体的なコード・フローを示しています。
図 C-1 KP ルーチンの実行
ここでは,各ルーチンについて説明します。
構文:
C.2.1 概要
注意
この図で,メイン実行スレッドは連続ストリームとして示されていますが,実際の実行スレッドには非同期コンポーネントが含まれることがあります。アプリケーションは必要な KPB のスコープを維持するだけでなく,必要なすべての同期化も実行しなければなりません。
C.2.2 ルーチン説明
C.2.2.1 EXE$KP_START
status = EXE$KP_START(kpb, routine, reg-mask) |
このルーチンは,現在の実行スレッドを中断し,新しいスタックにスワップし,指定されたルーチンを呼び出します。 KP ルーチンの呼び出しには,割り当てられている KPB の 32 ビット・アドレスを引数として指定します。 KPB は無効かつ非アクティブでなければなりません。
構文:
C.2.2.2 EXE$KP_STALL_GENERAL
status = EXE$KP_STALL_GENERAL(kpb) |
このルーチンは,現在の実行スレッドをストールし,コンテキストを KP スタックに保存し,このルーチンを最後に起動または再起動した呼び出しに戻ります。 KPB は有効かつアクティブでなければなりません。
このルーチンからの戻り値 status は,このプロシージャを再起動したルーチンから渡されます。
構文:
C.2.2.3 EXE$KP_RESTART
EXE$KP_RESTART(kpb [, thread_status]) |
このルーチンを呼び出すと,EXE$KP_STALL_GENERL の最後の呼び出しから戻ることで,ストールされていたルーチンが再起動されます。この処理は,KP ルーチンを起動した元の実行スレッドとは完全に非同期に行われる操作です。 KPB は有効かつ非アクティブでなければなりません。
構文:
C.2.2.4 EXE$KP_RESTART
status = EXE$KP_END(kpb [, status]) |
このルーチンは,KP ルーチンを終了し,KP ルーチンを起動または再起動した最後の実行スレッドに制御を返します。 KPB は有効かつアクティブでなければなりません。 KPB は無効かつ非アクティブとしてマークされるため,最初に EXE$KP_START を呼び出して別の KP ルーチンを起動しない限り,この後の EXE$KP_RESTART や EXE$KP_STALL_GENERAL の呼び出しで KPB を使用することはできません。
EXE$KP_END を呼び出す代わりに,KP ルーチンは呼び出しルーチンに戻ることもできます。呼び出しルーチンに戻る場合,KP コードは KP_END を自動的に呼び出します。その場合,KP プロシージャからの戻り値 status は,状態引数として使用されます。
C.3 設計上の考慮点
目次 | 索引 |
|