library home hp.com home products and services support and drivers solutions
cd-rom home
End of Jump to page title
HP OpenVMS Systems
Documentation

Jump to content


HP OpenVMS

HP OpenVMS
OpenVMS Alpha から OpenVMS I64 へのアプリケーション・ポーティング・ガイド


前へ 次へ 目次 索引


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)()) 

パラメータ

C.1.7 スタック割り当て API

スタック割り当てルーチンの API は,メモリ・スタック割り当ての場合も RSE スタック割り当ての場合も同じです。ルーチンを呼び出すときは,割り当てられている KPB の 64 ビット・アドレスと,割り当てられるハードウェア固有のページ数 (ページレット数ではない) を整数で指定します。

スタック割り当てルーチンを指定する構文は次のとおりです。


status = alloc-routine (KPB_PQ kpb, const int stack_pages) 

割り当てルーチンは,ページ境界でアラインメントされたアドレス空間を割り当てるものと考えられます。厳密に必須というわけではありませんが,両端にアクセスされないガード・ページを配置することで,スタックを保護することを強くお勧めします。また,最小スタック・サイズは,少なくとも SYSGEN パラメータ KSTACKPAGES (グローバル・セル SGN$GL_KSTACKPAG) の値になるようにしてください。このように設定すると,アプリケーションを再コンパイルしなくても,スタック・サイズに関して特定の制御を行うことができます。また,I64 でのスタックの使い方は,従来のアーキテクチャとは大きく異なっているため,前に割り当てられていたスタック・サイズが適切でない可能性もあります。

メモリ・スタック割り当てルーチンでは,次の KPB フィールドを次のように設定する必要があります。

メモリ・スタック割り当てルーチンでは,次の KPB フィールドを次のように設定できます。

RSE スタック割り当てルーチンでは,次の KPB フィールドを次のように設定する必要があります。

RSE スタック割り当てルーチンでは,次の KPB フィールドを次のように設定できます。

どちらのルーチンも状態を呼び出しルーチンに返す必要があります。

C.1.8 システムで提供される割り当てルーチンと割り当て解除ルーチン

本システムでは,多くの標準割り当てルーチンが提供されます。これらのルーチンは,KP 割り当て API に準拠しており,アプリケーションの要件を満たす場合は,ユーザ作成ルーチンの代わりに使用できます。次の割り当てルーチンが提供されています。

次の割り当て解除ルーチンが提供されています。すべての割り当て解除ルーチンに, 1 つの引数 (KPB のアドレス) が必要です。

C.1.9 終了ルーチン

終了ルーチンは,EXE$KP_END が明示的に呼び出されるか,または KP ルーチンの最後に到達したときに, KP サービスから呼び出されます。 EXE$KP_USER_ALLOC_KPB には任意の割り当てルーチンを指定できるので,終了ルーチンは,アプリケーションで将来使用するために KPB をキャッシュに保存しておくか,またはスタックおよび KPB に対して必要な割り当て解除ルーチンを呼び出す必要があります。

終了ルーチンを呼び出すには,次に示すように, 2 つのパラメータを指定します。


void end_routine (KPB_PQ KPB, int status) 

C.2 KP 制御ルーチン

KPB とスタックが割り当てられた後,KP ルーチンの状態を判断する 4 つのルーチンを使用できます。

C.2.1 概要

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 ルーチンの実行


注意

この図で,メイン実行スレッドは連続ストリームとして示されていますが,実際の実行スレッドには非同期コンポーネントが含まれることがあります。アプリケーションは必要な 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 設計上の考慮点


前へ 次へ 目次 索引