EVENTSマクロによって複数のECBをFIFOで処理することができます。複数のECBにPOSTされている状態でも、WAIT=YES指定のEVENTSマクロ発行毎に完了済みのECBが順番に通知されます。しかし、同時に多くの非同期事象が完了するような場合は、1つのECB毎にEVENTS SVCを呼び出していてはオーバーヘッドが大きいです。通知済みのECBをまとめてプログラムで認識できれば、より少ないオーバーヘッドで複数のECBを完了順に知ることができます。
完了済みECBのピックアップ処理の例
わかりやすい基本的な方法
1 2 3 4 5 6 7 8 9 |
----+----1----+----2----+----3----+----4----+----5----+----6----+----7-- WAITLOOP DS 0H EVENTS TABLE=AEVTAB, WAIT FOR NEXT COMPLETION EVENT + WAIT=YES L R1,0(,R1) LOAD NEXT COMPLETION ECB : : : B WAITLOOP WAIT FOR NEXT COMPLETION EVENT |
より効率がよい方法(EVENTSの発行回数を最低限にする)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
----+----1----+----2----+----3----+----4----+----5----+----6----+----7-- SLR R2,R2 CLEAR LAST ECB POINTER WAITLOOP DS 0H EVENTS TABLE=AEVTAB, WAIT FOR NEXT COMPLETION EVENT + WAIT=YES,LAST=(2) LR R2,R1 GR2 --> COMPLETION ECB POINTER ECBLOOP DS 0H L R1,0(,R2) LOAD NEXT COMPLETION ECB : : : : : TM 0(R2),X'80' HERE IS FINAL ECB ? BO WAITLOOP YES, ALL COMPLETION ECB DONE LA R2,4(,R2) NO, LOCATE TO NEXT ECB POINTER B ECBLOOP DO NEXT ECB PROCESSING |
WAIT=YES指定のEVENTSマクロを発行した時点で複数のECBがPOST済みであれば、GR1が示す完了済みECBポインター・リストには複数のECBアドレスが登録されていて、最後のECBアドレスの先頭ビットは1になっています。これは、WAITマクロのECBLISTと同様の形式です。最初のECBをロードしたら、ポインター・リストのアドレスを+4すれば次のECBアドレスの格納エントリーに位置付けることができます。先頭ビットが1になっているエントリーのECBをロードして処理したら、そのポインター・エントリーのアドレスをLASTパラメーターに指定して再びWAIT=YES指定のEVENTSマクロを発行します。
1 2 3 4 5 6 7 8 9 10 11 12 |
+-----------------------------+ GR1 | POST済みECBLISTのアドレス | +-----------------------------+ I I 0 31 I +---+-------------------------+ +--> ECBLIST | 0 | 最初のECBのアドレス | +---+-------------------------+ | 0 | 2番目のECBのアドレス | +---+-------------------------+ | 1 | 3番目のECBのアドレス | +---+-------------------------+ |