This information provides a coded example illustrating a mainline routine with both a recovery routine and a retry routine as entry points in the mainline code.
The code in this example does not contain any real function. The mainline code does little more than save status, establish addressability, obtain a dynamic area (making the code reentrant), define a recovery routine, and issue the ABEND macro to pass control to the system.
EXAMPLE CSECT * SAMPLE PROGRAM THAT USES ESTAEX
EXAMPLE AMODE 31
EXAMPLE RMODE ANY
USING EXAMPLE,15 * ESTABLISH TEMPORARY ADDRESSABILITY
B @PROLOG * BRANCH AROUND EYE CATCHER
DC CL24'EXAMPLE 04/10/92.01' * EYE CATCHER
*
* USE THE LINKAGE STACK TO SAVE STATUS ON ENTRY TO THE PROGRAM.
*
@PROLOG BAKR 14,0 * SAVE REGISTER/PSW STATUS
*
* ESTABLISH ADDRESSABILITY FOR THIS PROGRAM.
*
LR 12,15 * REG 12 BECOMES BASE REGISTER
DROP 15 *
USING EXAMPLE,12 * ESTABLISH ADDRESSABILITY
*
* OBTAIN DYNAMIC STORAGE AREA FOR THIS REENTRANT PROGRAM.
*
L 2,DYNSIZE * LENGTH TO OBTAIN
STORAGE OBTAIN,ADDR=(1),SP=0,LENGTH=(2)
LR 13,1 * SAVE DYNAMIC AREA ADDRESS
USING DYNAREA,13 * ADDRESSABILITY TO DYNAMIC AREA
*
* SET UP THE REMOTE PARAMETER LIST FOR THE ESTAEX MACRO.
*
MVC RMTESTAEX(@LSTSIZE),LSTESTAEX
*
* DEFINE AND ACTIVATE AN ESTAEX RECOVERY ROUTINE AT LABEL 'RECOVERY'.
*
ESTAEX RECOVERY,PARAM=DYNAREA,RECORD=YES,MF=(E,RMTESTAEX)
***********************************************************************
*
* CODE FOR THE MAINLINE ROUTINE FUNCTION CAN BE INSERTED HERE
*
* IF AN ERROR OCCURS IN THE MAINLINE ROUTINE, THEN THE SYSTEM WILL
* PASS CONTROL TO RECOVERY.
*
***********************************************************************
*
RETRYPT DS 0H
***********************************************************************
*
* CODE FOR THE RETRY ROUTINE FUNCTION CAN BE INSERTED HERE
*
***********************************************************************
ESTAEX 0 * DELETE THE ESTAEX
LR 1,13 * FREE DYNAMIC AREA, ADDRESS TO FREE
L 2,DYNSIZE * LENGTH TO FREE
STORAGE RELEASE,ADDR=(1),SP=0,LENGTH=(2)
PR * RESTORE STATUS & RETURN TO CALLER
***********************************************************************
*
* RECOVERY ROUTINE
*
***********************************************************************
RECOVERY DS 0H * ENTRY POINT FOR ESTAEX RECOVERY ROUTINE
*
* HANDLE INPUT FROM THE SYSTEM AND RE-ESTABLISH ADDRESSABILITY FOR
* BASE REGISTER (12) AND DYNAMIC AREA REGISTER (13)
*
PUSH USING
DROP , * ENSURE NO SPURIOUS USING REFERENCES
USING RECOVERY,15 * TEMPORARY ADDRESSABILITY
L 12,#BASE * RELOAD THE BASE REGISTER
DROP 15 * RELEASE TEMPORARY ADDRESSABILITY
USING EXAMPLE,12 * USE THE BASE REGISTER
USING DYNAREA,13 * DYNAMIC AREA ADDRESSABILITY
C 0,TESTNOSDWA * IS THERE AN SDWA PRESENT?
BE NOSDWA * NO, DO NOT USE THE SDWA
HAVESDWA DS 0H
USING SDWA,1 * ADDRESSABILITY TO SDWA
L 13,SDWAPARM * ADDRESS OF PARAMETER ADDRESS
L 13,0(13) * PARAMETER ADDRESS (DYNAREA)
MVC SAVE_ABCC,SDWAABCC * SAVE THE COMPLETION CODE
B RECOV1 * CONTINUE WITH COMMON RECOVERY
NOSDWA LR 13,2 * PARAMETER ADDRESS (DYNAREA)
ST 1,SAVE_ABCC * SAVE THE COMPLETION CODE
SR 1,1 * NO SDWA IS AVAILABLE, CLEAR REGISTER
*
* COMMON RECOVERY PROCESSING
*
RECOV1 DS 0H * COMMON RECOVERY PROCESSING
ST 1,SAVE_SDWA * SAVE THE SDWA ADDRESS
ST 14,SAVE_RETURNR14 * RETURN ADDRESS TO THE SYSTEM
*
***********************************************************************
*
* CODE FOR THE RECOVERY ROUTINE FUNCTION SHOULD BE INSERTED HERE
*
***********************************************************************
*
* IF THERE IS NO SDWA, THEN SET UP FOR PERCOLATION
*
L 1,SAVE_SDWA * RESTORE SDWA REGISTER (1)
LTR 1,1 * IS THERE AN SDWA?
BZ NORETRY * NO, DO NOT ATTEMPT TO RETRY
*
* CHECK SDWACLUP TO SEE IF RETRY IS ALLOWED
*
TM SDWAERRD,SDWACLUP * IS RETRY ALLOWED?
BNZ NORETRY * NO, DO NOT ATTEMPT TO RETRY
*
* SET UP THE RETURN PARAMETERS TO THE SYSTEM. THE SETRP MACRO UPDATES
* THE SDWA. NOTE: THE WKAREA PARAMETER DEFAULTS TO REGISTER 1, WHICH
* HAS THE ADDRESS OF THE SDWA. ALSO NOTE THAT OTHER REGISTERS MIGHT
* NEED TO BE UPDATED TO MEET THE NEEDS OF DIFFERENT PROGRAMS.
*
ST 12,SDWASR12 * BASE REGISTER 12 FOR RETRY
ST 13,SDWASR13 * DYNAMIC AREA REGISTER 13 FOR RETRY
SETRP RETREGS=YES,RC=4,RETADDR=RETRYPT,FRESDWA=YES
B RECOV2 * CONTINUE WITH COMMON RECOVERY
NORETRY DS 0H * BRANCH HERE WHEN NOT GOING TO RETRY
LA 15,0 * RETURN CODE TO INDICATE PERCOLATION
RECOV2 DS 0H * COMPLETE THE RETURN TO THE SYSTEM
L 14,SAVE_RETURNR14 * SET THE RETURN ADDRESS TO THE SYSTEM
BR 14 * RETURN TO THE SYSTEM
*
* STATIC STORAGE AREA
*
TESTNOSDWA DC F'12' * TEST FOR NO SDWA CONDITION
#BASE DC A(EXAMPLE) * BASE REGISTER VALUE
DYNSIZE DC AL4(@DYNSIZE) * DYNAMIC AREA SIZE
LSTESTAEX ESTAEX RECOVERY,MF=L * LIST FORM OF ESTAEX PARAMETER LIST
@LSTSIZE EQU *-LSTESTAEX * SIZE OF ESTAEX PARAMETER LIST
*
* DYNAMIC AREA STORAGE FOR REENTRANT PROGRAM
*
DYNAREA DSECT * DYNAMIC STORAGE
SAVEAREA DS 18F * REGISTER SAVE AREA
SAVE_SDWA DS F * SDWA ADDRESS ON ENTRY TO RECOVERY
SAVE_ABCC DS F * COMPLETION CODE
SAVE_RETURNR14 DS F * RETURN ADDR. TO SYSTEM FROM RECOVERY
RMTESTAEX DS CL(@LSTSIZE) * REMOTE ESTAEX PARAMETER LIST
STATUS DS F * MAINLINE STATUS INDICATOR
@ENDDYN DS 0X * USED TO CALCULATE DYNAMIC AREA SIZE
@DYNSIZE EQU ((@ENDDYN-DYNAREA+7)/8)*8 * DYNAMIC AREA SIZE
*
* INCLUDE MACROS
*
IHASDWA
END