ESTAEは、プログラム独自のリカバリー環境を作成するためのAPIです。リカバリーとは、プログラムが異常終了する際に行われる一連の回復手順です。ESTAEを使用すれば、プログラムは異常終了の発生を受け取り、必要な診断情報を集め、必要に応じた回復処理が行えます。異常終了させずにプログラムの実行を再開させることもできます。同様のサービスとしてSPIEとESPIEもありますが、ESTAEはプログラム割込みに限定されず全ての異常終了についてトラップすることができます。
ESTAEによるABENDリカバリー環境の作成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
----+----1----+----2----+----3----+----4----+----5----+----6----+----7-- MAINLINE DS 0H : : L R2,=CL4'PARM' GR2 <-- C'PARM' ESTAE TRAPABND, BUILD OUR ESTAE ENVIRONMENT + PARAM=(2), + TERM=YES, + XCTL=YES, + PURGE=NONE, + ASYNCH=NO * : : メインラインの処理 : : B EXITPROG * BADDATA DS 0H WTO '(MAIN)OCCURRED DATA EXCEPTION(ABEND S0C7)' : : 残りの処理があれば続ける : : * EXITPROG DS 0H ESTAE 0 PURGE OUR ESTAE ENVIRONMENT これは以前のESTAE環境に戻す処理。 他のモジュールから呼ばれる サブルーチンであれば必ず以前の 環境を戻すこと。 : : : * *----------------------------------* * * ESTAE EXIT ROUTINE * * * ============================== * * * GR0 --> RTM STATUS * * * 12: SDWA NOT AVAILABLE * * * GR1 --> SDWA OR TCBCMP(GR0=12) * * * GR2 --> PARM AT ESTAE ISSUED * * * GR14 -> RETURN ADDR TO OS * * * GR15 -> ENTRY ADDR * * *----------------------------------* TRAPABND DS 0H ENTER AT HERE WHEN OCCURED + PGM-ABEND INTERRUPTION USING *,RF DEFINE TEMP BASE L RC,=A(MAINENTR) ESTABLISH OUR BASE REGISTER DROP RF FORGET TEMP BASE LR R6,R1 GR6 --> SDWA USING SDWA,R6 ADDRESS IT SLR R0,R0 CLEAR WORKREG ICM R0,B'0111',SDWACMPC GR0 --> INTERRUPT CODE L R1,SDWAEC2+4 GR1 --> INTERRUPT ADDRESS SPACE , CL R0,=A(X'000C7000') DATA EXCEPTION(ABEND S0C7) ? BNE DOABEND NO, ABEND WITH DIAG MSG SPACE , ST R0,SDWASRSV+0*4 PASS GR0(ABEND CODE) TO MAIN ST R1,SDWASRSV+1*4 PASS GR1(ABEND ADDR) TO MAIN L RA,=A(BADDATA) LOAD RESUME ADDRESS SETRP WKAREA=(6), SDWA ADDRESS + DUMP=NO, INDICATE IGNORE RTM DUMP + RETADDR=(10), RETRY ROUTINE ADDRESS + RETREGS=YES, PASS REGS FROM SDWA + FRESDWA=YES, NO LONGER NEED SDWA + RC=4 INDICATE SCHEDULING RETRY RTN BSM 0,RE CONTINUE MAINLINE PROCESSING SPACE , DOABEND DS 0H LR R2,R1 SAVE ABEND ADDRESS SRL R0,12 MOVE CODE TO LOW ORDER BYTE LA R1,DOUBLE LOAD WORKAREA BAS RE,CNVRTX GR0 CONVERT TO HEX-DECIMAL MVC SWTOLIST+26(3),DOUBLE+1 SET INTERRUPT CODE IN MSG LR R1,R2 LOAD ABEND ADDRESS SLL R1,8 EDIT INTERRUPTED ADDRESS SRL R1,8 I SLR R1,RC V LR R0,R1 SET INTERRUPT ADDR IN MSG LA R1,SWTOLIST+39 I BAS RE,CNVRTX V WTO MF=(E,SWTOLIST) INFORM PROGRAM ABENDED MSG SETRP WKAREA=(6), SDWA ADDRESS + DUMP=YES, REQUIRE TO FORMATTED DUMP + RC=0 INDICATE PERCOLATION SVC 3 RETURN TO OS(END OF PROGRAM) CNVRTX DS 0H CONVERT GR0 TO HEX-DECIMAL LA R1,3(,R1) I LA RF,4 I STC R0,0(,R1) I NI 0(R1),X'0F' I TR 0(1,R1),CNVTRT I SRL R0,4 I BCTR R1,0 I BCT RF,*-2-4-6-4-4 I BR RE V CNVTRT DC CL16'0123456789ABCDEF' SWTOLIST DS 0F WTO 'THIS PROGRAM ABENDED(SXXX) OFFSET(X0000)',MF=L *---------------------------------------------------------------------* DOUBLE DC D'0' : : : IHASDWA , SDWA MAP |
ESTAEを使用した簡単なサンプルです。メインの処理で何らかのABENDが発生すると、ESTAE出口ルーチン(リカバリー出口ルーチン)TRAPABNDが実行されます。SPIE/ESPIEと異なり、ABEND時のレジスターが保持されているわけではないので、呼び出された外部サブルーチンとしてのハウス・キーピング処理が必要です。
ABENDコードは、SDWACMPCフィールドに入っています。xxxyyyの3バイトで、xxxがSYSTEM ABENDコード、yyyがUSER ABENDコードを示します。x001000ならS001、x000001ならU0001です。サンプルでは、ABENDコードがS0C7の場合、ABENDせずにメイン処理のラベルBADDATAから再開し、S0C7でなければABENDコードとABENDしたプログラム内オフセットをメッセージ出力してABENDします。
プログラム割込みだけをトラップするならSPIE/ESPIEの方が簡単ですが、その他のシステムABENDなども含めて全ての異常終了をトラップするにはESTAEを使用します。ESTAEマクロでは、回復(リカバリー)ルーチン、回復ルーチンへ渡すパラメーターやその他のオプションを指定します。
ABENDが発生した際に制御を受けるのが回復ルーチンです。回復ルーチンにはSDWAが渡されます。このSDWAにABEND時の詳細な情報が入っています。ABEND時や最終割込み時のPSW、レジスターの内容、プログラム・アドレス、さまざまなステータス情報などです。SDWAが渡されない場合もあります。この場合、GR0に12が設定されています。GR1には、SDWAの代わりにABENDコードがTCBCMPフィールドの内容で格納されています。
回復ルーチンは、リカバリー可能と判断したら再試行(リトライ)ルーチンを設定します。再試行ルーチンとは、回復ルーチンがOSに戻った後、元のプログラムを再び実行させる開始点です。呼び出されてどこかへ戻るサブルーチンではなく、プログラムの実行を継続する再開点と考えればいいでしょう。再試行ルーチンを実行してABENDを回避するには、SETRPマクロに再試行ルーチンのアドレスとRC=4を指定します。レジスターに特定の値を入れて制御を渡したい場合は、SDWASRSVの対応するレジスター番号のフィールドに置き換える値を入れ、RETREGS=YESを併せて指定します。回復ルーチンはABENDしたタスクの新たなIRBルーチンとして実行されますが、再試行ルーチンは元のプログラムのRB(PRB)で実行されます。なお、SETRPマクロにDUMPパラメーターを指定することで、ダンプの採取をコントロールできます。例え、ABENDを回避する場合でも、調査のためにダンプを出力する場合、SETRPマクロでDUMP=YESとすれば回復時にダンプがSYSUDUMP、SYSABENDあるいはSYSMDUMP DDステートメントに定義したデータセットに出力されます。
一般のプログラムではESTAEを使う必要は必ずしもありませんが、OSのABENDダンプではなく、もっとプログラムに特化した独自の診断情報を集めたい場合などには便利な機能です。空間に固有なリソース以外のシステム共通のリソースを使うプログラムの場合は、必ずESTAEでABENDをリカバリーすべきです。ABENDを回避せずに異常終了するにしても、ESTAEは必須と言っていいでしょう。この場合のESTAEの回復ルーチンは、プログラムのリカバリーではなくプログラムが使用したリソースの解放のために使います。空間に固有なリソースはABENDしてもOSがクリーンアップしてくれますが、共通域(例、CSA)などOSがクリーンアップしてくれないリソースは、確保したプログラムの責任できちんと解放する必要があります。
サンプルでは無条件にSDWAを使用していますが、業務プログラムなどではSDWAの有無を判別すべきです。実際にはSDWAが渡されないケースは通常ではまずなくて、リージョン内の仮想記憶がSDWAも作れないほど一杯であるような状況ぐらいと思います。私自身はSDWAが渡されなかった経験はありませんでした。しかし、予期しない事が起きるのがソフトウェアでもありますから、実際に通ることはないであろうにしてもSDWAが提供されたかどうかは判定しなければなりません。実際にSDWAが渡されなかった場合、恐らくはその空間にとっては危機的なメモリー不足の状況でしょうから、絶対解放が必要なリソースのクリーンアップだけを行い、速やかにパーコレート(再試行を要求せずにOSに戻る)すればいいでしょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
ESTAEXIT DS 0H USING *,RF DEFINE TEMP BASE CH R0,=H'12' AVAILABLE SDWA ? BNE HAVESDWA YES, DO STD PROCESSING + NO, GR0=12 + GR1=ABEND CODE(00XXX000) + GR2=ESTAE PARM BAS R10,CLUPCMRS CLEAN HOLDING COMMON RESOURCES SLR RF,RF INDICATE PERCOLATION SVC 3 REQUIRE TO PERCOLATE ABEND... SPACE , HAVESDWA DS 0H L R12,AOURBASE ESTABLISH OUR BASE REGISTER DROP RF FORGET TEMP BASE LR R3,R1 GR3 --> SDWA USING SDWA,R3 ADDRESS IT : : : |