| 日本-日本語 | 
      
  | 
  
      
  | 
  
| 
 | 
     
OpenVMS マニュアル | 
    
  
  | 
    
     
HP OpenVMS MACRO コンパイラ 
 | 
    
    
  
| 目次 | 索引 | 
他の言語で記述されたコードのロック
VAX MACRO モジュール中で $LOCK_PAGE_INIT マクロを使用することで,他のプログラミング言語で記述されたコードもロックダウンすることができます。生成されたコードで psect $LOCK_PAGE_2 を使用しており,生成されたリンケージ・セクションで psect $LOCK_LINKAGE_2 を使用していれば,このマクロによって,任意の言語で記述された,任意のモジュール中の任意のコードがロックされます。
オンザフライのロックダウンでは,$LOCK_PAGE と $UNLOCK_PAGE がそれぞれロック対象コード・セクションの先頭と終わりをマークします。マークされたコードは,ロック対象 psect 内の独立したルーチンとなり,イメージ中のあらゆる場所にあるすべてのロック対象コードがこの psect に配置されます。
$LOCK_PAGE は,ロックされるルーチンのページとリンケージ・セクションをワーキング・セットにロックし,JSR でそこにジャンプします。このマクロは,実行可能コード内にインラインで配置されます。このマクロと対応する $UNLOCK_PAGE マクロの間のすべてのコードが,ロックされるルーチンに入れられ,ロックダウンされます。
$UNLOCK_PAGE はロックされたルーチンから戻り,ページとリンケージ・セクションをワーキング・セットからアンロックします。このマクロは,実行可能コードの, $LOCK_PAGE マクロの後のいずれかの場所に,インラインで配置します。
$LOCK_PAGE と $UNLOCK_PAGE には,オプションのパラメータ ERROR があります。これは,$LKWSET または $ULWSET の呼び出しに失敗した場合に分岐するエラー・アドレスです。 $UNLOCK_PAGE には 2 番目のオプション・パラメータ LINK_SECT があります。 LINK_SECT は,$LOCK_PAGE マクロが実行されたときの実際のリンケージ psect が,デフォルトのリンケージ psect ($LINKAGE) でなかった場合に戻るリンケージ psect です。
どちらのマクロでも,すべてのレジスタが保存されます。ただし,エラー・アドレス・パラメータが指定されており,いずれかの呼び出しが失敗すると,R0 には失敗した呼び出しの状態が設定されます。コードのロックまたはアンロックの呼び出しに失敗した場合は R1 に 0 が設定され,その呼び出しは成功したものの,リンケージ・セクションのロックまたはアンロックの呼び出しが失敗した場合には 1 が設定されます。
$LOCK_PAGE マクロで制御がコードに渡り, $UNLOCK_PAGE マクロで制御が戻ります。 $LOCK_PAGE マクロを実行したときに有効だったローカル・シンボル・ブロックは, $UNLOCK_PAGE マクロを実行すると復元されますが,ロックされたコードは独立したルーチンとなるため,ロックされたコード自体は個別のローカル・シンボル・ブロックを持ちます。名前付きシンボルが使用されている場合でも,ロックされたコード・セクションへの外からの分岐や,ロックされたコード・セクションから外への分岐は禁止されており,コンパイラで次のエラー・メッセージが出力されます。
%AMAC-E-MULTLKSEC, Routines which share code must use the same linkage psect.  | 
ロックされるコードは個別のルーチンになり,スタック・コンテキストは同じでなくなるため,ルーチン内でのローカル・スタック・ストレージへの参照は,すべて変更する必要があります。
![]()  |   注意 オンザフライのロックダウンは,4 つのシステム・サービスの呼び出しと,実行の都度追加のサブルーチンを呼び出すことによるオーバヘッドがあるため,性能が重要なコードでロックダウンを行う場合は,初期化時のロックダウンに変更することをお勧めします。イメージ内の他のルーチンが初期化時のロックダウンを使用している場合は,オンザフライのロックダウンを初期化時のロックダウンに変更する必要があります。  | 
表 3-2 に,オンザフライのロックダウンでこれらのマクロを使用するために必要な変更を示します。 $UNLOCK_PAGE マクロが,実行されるように,そのマクロが RSB の前にある点に注意してください。ルーチンによって R0 とR1 で渡される情報は, $UNLOCK_PAGE によってそれらのレジスタが保護されるため,内容はそのままとなります。
| コード・セクション | VAX システム | Alpha システム | 
|---|---|---|
| メイン・コード | 
Routine_A:  | 
Routine_A:  | 
表 3-3 に,同じオリジナルのコードと,初期化時のロックダウンで必要な変更を示します。
| コード・セクション | VAX システム | Alpha システム | 
|---|---|---|
| 初期化 | 
 なし。  | 
$LOCK_PAGE_INIT  | 
| メイン・コード | 
Routine_A:  | 
$LOCKED_PAGE_START  | 
同期に関する以下の情報は, OpenVMS VAX システムから OpenVMS Alpha システムまたは OpenVMS I64 システムにコードを移植する場合に該当します。
![]()  |   注意 この同期の保証は,マルチプロセシング・システムにのみ該当します。ユニプロセシング版のスピンロックは,インターロックされる命令を使用しません。その結果,ユニプロセッサのスピンロック,ミューテクス,ロック・マネージャの同期では,メモリ・バリアは提供されません。  | 
ADDL3 R1, R2, 4(R3)      ; Save total 
EVAX_TRAPB                 ; Insure any arithmetic traps handled by 
                           ; existing handler 
MOVAB   HANDLER2, 0(FP)    ; Enable new condition handler 
 | 
| 目次 | 索引 | 
      
  | 
  ||||||||