Understanding recovery through a coded example

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.

The purpose of the example is just to illustrate how you might code a program that contains both a recovery routine and a retry routine, and how the three routines interact. The example also illustrates how you design an ESTAE-type recovery routine to allow for the possibility that the system might not provide an SDWA.
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