*DECK HAPFAIL 
USETEXT NIPDEF
USETEXT ACB 
USETEXT ACNB
USETEXT AHEADER 
USETEXT ACNT
USETEXT APPSTAT 
USETEXT AT
USETEXT DISTAIL 
USETEXT DRHDR 
USETEXT DUMPFLG 
USETEXT FLIST 
USETEXT KDIS
USETEXT MSGIDX
USETEXT NWLHEAD 
USETEXT NWLNTRY 
USETEXT OVERLAY 
USETEXT PARAMS
USETEXT PT
USETEXT SUPABH
USETEXT SUPMSG
USETEXT PWL 
USETEXT SWAPIN
      PRGM HAPFAIL;          # PROCESS A FAILED APPLICATION            #
  
 STARTIMS;
 #
*1DC  HAPFAIL 
* 
*     1. PROC NAME           AUTHOR              DATE 
*        HAPFAIL             E. GEE              77/07/27 
* 
*     2. FUNCTIONAL DESCRIPTION.
*        THIS ROUTINE IS RESPONSIBLE FOR PROCESSING A *FAILED-APP*
*        STATUS FROM A NWL OR A *RCUCPGONE* RETURN CODE FROM A SCP CALL.
* 
*     3. METHOD USED. 
*          CHECK IF FAILURE OCCURRED WHILE PROCESSING WORKLIST (APP IS
*            NO LONGER IN SYSTEM) OR OPERATING SYSTEM INFORMED US OF
*            APPLICATION-FAILED STATUS. 
*          IF NIP RECEIVED APPLICATION-FAILED STATUS, CHECK TO SEE IF 
*            ACB OR (NO ACB) SWAPIN ENTRY EXISTS.  IF SO CLEAN UP 
*            APPROPRIATE ENTRIES. 
*          IF ACB EXISTS, CHECK IF IT IS NVF THAT FAILED.  IF SO, ABORT.
*          IF APP STILL HAS CONNECTIONS WITH NETWORK, ISSUE SCP FUNCTION
*            TO CLEAR ALL CONNECTIONS.
*          SEND FAIL/APPL SUP MSG TO NVF IF NECESSARY 
*          CLEAN UP WORKLIST
* 
*     4. ENTRY PARAMETERS.
*          FAILADR           ACB ADDRESS OR NWL ADDRESS 
* 
*     5. EXIT PARAMETERS. 
*          FAILADR           = 0. 
* 
*     6. COMDECKS CALLED AND SYMPL TEXTS USED.
*        ACB     APPSTAT   AT   DRHDR     DUMPFLG 
*        FLIST     MSGIDX    NIPDEF    NWLHEAD
*        NWLNTRY   OPSIZE    OVERLAY   PARAMS 
*        PT        SWAPIN 
*        ACNB     AHEADER     ACNT     KDIS 
*        SUPABH     SUPMSG
* 
*     7. ROUTINES CALLED. 
*          ABORT             ABORT PROGRAM AND DAYFILE MESSAGES 
*          BLINK             LINK MESSAGE ON DATA RING
*          HCSTTP            HOST CONNECTION STATE TABLE PROCESSOR
*          MGETS             ALLOCATE BUFFER
*          MRELS             RELEASE BUFFER SIZE
*          OMSG              ISSUE DAYFILE MESSAGE
*          OSCHAPP           SCHEDULE APPLICATION 
*          OSCCALL           SYSTEM-CONTROL-POINT CALL
*          OVLCALL           LOAD OVERLAY 
*          RDUMP             DUMP NIP-S FIELD LENGTH
*          XRECALL           ISSUE EVENT RECALL 
*          XSAPPDL    OVL    DELINK (NO ACB) SWAPIN ENTRY 
*          XTRACE            TRACES CALLS 
*          XERRMSG    OVL    DAYFILE MESSAGE
* 
*     8. DAYFILE MESSAGES AND OTHER IMPORTANT INFORMATION.
*          NVF FAILURE. 
*          NIP UNABLE TO FIND FAILED APP XXXX   . 
* 
*        THIS PROGRAM IS A PRIMARY OVERLAY LOADED BY SUBROUTINE OVLCALL.
*        WHEN EXECUTION HAS COMPLETED, A JUMP IS MADE TO LOCATION RJMAIN
*        TO RETURN TO THE CALLING PROGRAM.
* 
*        W A R N I N G - THIS PROGRAM CANNOT EXCEED THE PRIMARY 
*CALL OPSIZE
* 
*        THIS OVERLAY IS CALLED BY HHIR AND XSACB.
* 
 #
 STOPIMS; 
# 
                    EXTERNAL VARIABLES
# 
 XREF BEGIN 
   PROC ABORT;               # ABORT PROGRAM AND DAYFILE MESSAGES      #
   PROC BLINK ; 
   PROC HCSTTP ;
   PROC MGETS ; 
   PROC MRELS;               # RELEASE BUFFER SPACE                    #
   PROC OVLCALL;             # LOAD OVERLAY                            #
   PROC OMSG;                # DAYFILE MESSAGE                         #
   PROC OSCCALL;
   PROC OSCHAPP ; 
   PROC RDUMP;               # DUMP NIP-S FIELD LENGTH                 #
   PROC XRECALL;             # ISSUE EVENT RECALL                      #
   PROC XTRACE;              # TRACE CALLS                             #
   LABEL RJMAIN;             # RETURN ADDRESS IN OVLCALL               #
   END
# 
                    INTERNAL VARIABLES
# 
 ITEM BLKADDR ; 
 ITEM I ; 
 ITEM LIMIT ; 
 ITEM FOUND B;               # TRUE = FOUND SWAPIN ENTRY FOR FAILED APP#
 ITEM IDX;
 ITEM OLDACNT;               # ADDR OF ACNT OF FAILED APP              #
 ITEM SECACN;                # APP CON NUM FOR SECONDARY APPLICATION   #
 ITEM HWHERE;                # INDEX TO UNASSIGNED APP NAME IN ALERT   #
 ITEM HAPNO;
 ITEM HINDEX; 
 ITEM FAILANAME C(7); 
 ARRAY LOCALFL S(FLSIZE) ;
   BEGIN
   ITEM WORD U(0,0,WL) ;
   END
  BASED ARRAY HALTNR [1:1] S(1);
    BEGIN 
    ITEM  HALTN C(00,00,07);
    END 
 SWITCH HHN HM,HA,HB,HC,HD,HHE; 
#**********************************************************************#
      BEGIN 
      CONTROL IFEQ DEBUG,1 ;
        XTRACE("HAPFA") ; 
      CONTROL FI; 
# 
      DETERMINE IF APP FAILED WHILE NIP WAS PROCESSING ITS WORKLIST OR
      NIP RECEIVED APPLICATION FAILED STATUS FROM CPU MONITOR 
# 
      P<DRHDRWD> = FAILADR; 
      IF BLKID[0] NQ NWLIDVALUE 
      THEN
        BEGIN                          # APPL FAILS WHILE PROCESSING   #
        ACBADDR = FAILADR ;            # NWL OR PWL                    #
        P<ACB> = ACBADDR ;
        END                            #                               #
      ELSE
        BEGIN                          # NORMAL FAILURE CASE           #
        P<NWLHEADER> = FAILADR ;       # NWL BUFFER                    #
        JOBID = NWLJOBID[0] ;          # JOB ID WORD                   #
        FOUND = FALSE ;                # INITIALIZE                    #
        ACBADDR = 0 ; 
# 
       SEARCH FOR ACB 
# 
       FOR I = 1 STEP 1 WHILE I LQ ATHAN[0] 
                            AND NOT FOUND 
       DO 
         BEGIN                         # SEARCHING                     #
         P<ACB> = ATACBA[I] ; 
         IF ACBJNWD[0] EQ JOBID 
         THEN 
           BEGIN                       # SAME ID WORD                  #
           ACBADDR = P<ACB> ; 
           FOUND = TRUE ; 
           IF ATASBI[I] # SWAPIN IN PROGRESS                           #
             AND ACBSCPCB[0] EQ 0 # WAITING FOR SWAPIN COMPLETION      #
           THEN 
             BEGIN
             XRECALL(LOC(ACBSWAPWR[0])); # ISSUE EVENT RECALL          #
             ACBID[0] = ACBIDVALUE; 
             END
           ATASB[I]=FALSE;# CLEAR APPLICATION STATUS BITS # 
           END                         # SAME ID WORD                  #
         END                           # SEARCHING                     #
  
       IF NOT FOUND 
         OR ATNVFN[ACBAN[0]] # NETOFF IN PROGRESS                      #
       THEN 
         BEGIN                         # ACN NOT FOUND                 #
# 
      LOOK INTO THE SWAP-IN RING
# 
         FOR IDX = SWAPINFP WHILE IDX NQ 0
                               AND IDX NQ LOC(SWAPINFP) 
         DO 
           BEGIN                       # SEARCH    SWAP-IN  RING       #
           P<SWPIE> = IDX ; 
           IF SWPIJOBID[0] EQ JOBID 
           THEN 
             BEGIN                     # IN SWAP-IN     RING           #
             FOUND = TRUE ; 
             IF SWPICB[0] EQ 0
             THEN # WAITING FOR SCP REQUEST COMPLETION                 #
               XRECALL(LOC(SWPIFW[0])); # ISSUE EVENT RECALL           #
             IDX = SWPIWR[0] ;
             IF IDX NQ 0
             THEN 
               MRELS(IDX) ; 
             IDX = SWPIFL[0] ;
             IF IDX NQ 0
             THEN 
               MRELS(IDX) ; 
             IDX = SWPINFP[0];
             PARAMS1 = P<SWPIE> ;      # REMOVE ENTRY FOR SWAP IN RING #
             OVLNAME = XSAPPDLP ; 
             OVLCALL ;
             MRELS(P<SWPIE>) ;         # RELEASE SWAP-IN RING ENTRY   # 
             END                       # IN  SWAPPING IN RING          #
  
           ELSE 
             IDX = SWPINFP[0] ; 
           END                         # SEARCHING                     #
  
         END                           # ACB NOT FOUND                 #
  
       IF NOT FOUND 
       THEN 
         BEGIN                         # ACB NOT FOUND IN *AT* AND     #
         CONTROL IFEQ DEBUG,1;
         PARAMS1 = DFMSG04 ;           # IN SWAP-IN  RING              #
         PARAMS2 = JOBID ;             # ISSUE A DAYFILE MESSAGE       #
         OVLNAME = XERRMSGP ; 
         OVLCALL ;
         CONTROL FI;
         P<FLHEAD> = LOC(LOCALFL) - 1 ;  # BLOCK FOR SCP CALL          #
         FLFW[0] = 0 ;
         FLUCPA[0] = -1 ; 
         FLFC[0] = SFENDT ; 
         FLJOBID[0] = JOBID ; 
         P<FLE> = LOC(LOCALFL) ;
         HFCALL = TRUE ;
         OSCCALL(FLE) ; 
         HFCALL = FALSE ; 
  
         IF FLRC[0] EQ RCUCPAOOR
         THEN 
           BEGIN                         # BAD REASON CODE RETURNED    #
           D25M2[0] = "HAPFAIL" ; 
           OMSG(DFMSG25,0);  # NIP DUMP TAKEN                          #
           RDUMP ;
           END                           # BAD REASON CODE RETURNED    #
         END
  
          MRELS(P<NWLHEADER>) ;             # RELEASE THE NWL          #
  
        END                            # APPL. FAILURE CASE            #
# 
      IF ACB EXISTS      , CALL STATE TABLE PROCESSOR 
# 
      IF ACBADDR NQ 0 
      THEN
        BEGIN                          # ACB STILL EXISTS              #
        FAILANAME = ACBANAME[0];       # SAVE FAILED APPLICATION NAME  #
        IF ACBAN[0] EQ NVFAN
        THEN
          ABORT(DFMSG10,0) ;             # NVF NETTING OFF             #
  
        IF ATNVFA[ACBAN[0]] 
        THEN
          BEGIN                    # APPLIACTION DID NOT NETON O.K.    #
          PARAMS1 = ACBAN[0] ;     # RELEASE ACB AND NOT SEND APPL/FAIL#
          OVLNAME = RELACBP ;      # TO NVF                            #
          OVLCALL ; 
          END                      # NET/ON/A RECEIVED FOR THIS APPL   #
  
        ELSE
  
          BEGIN                    # APPLICATION NETTED ON O.K.        #
          IF NOT ATNVFN[ACBAN[0]] 
            AND NOT ATNVFF[ACBAN[0]]
          THEN # APPLICATION NOT AWAITING NET/OFF/N FROM NVF           #
          BEGIN 
  
          P<ACNT> = ACBACNT[0] ;         # ACNT TABLE                  #
          OLDACNT = P<ACNT>;
  
          LIMIT = ACNTHCN[0] - ACNTMINACN[0] + ACNTHSIZE ;
          FOR IDX = ACNTHSIZE STEP 1 UNTIL LIMIT
          DO
            BEGIN                        # CALL HC STATE TABLE         #
                                         # WITH APP FAILED TRIGGER     #
            IF ACNTACNB[IDX] NQ 0 
            THEN
              BEGIN 
              P<ACNB> = ACNTACNB[IDX] ; 
              ACNBRC[0] = RCRC"AF" ;     # RC= 2, APPL FAILURE         #
              HCSTTP(ACBADDR,ACNBACN[0],FAILAP,0) ; 
              END 
            ELSE
              BEGIN                        # IN-ACTIVE ENTRY           #
              IF ACNTSECID[IDX] NQ 0       # SEC  ID NOT ZERO          #
              THEN
                BEGIN                      # LOANED CONN. EXIT         #
                SECACN = ACNTSECACN[IDX];  # ACN FOR SECONDARY APP     #
                P<ACB> = ATACBA[ACNTSECAN[IDX]];  # ACB OF SECONDARY AP#
                P<ACNT> = ACBACNT[0];  # ACNT OF SECONDARY APP         #
                P<ACNB> = ACNTACNB[SECACN-ACNTMINACN[0]-ACNTHSIZE]; 
                IF P<ACNB> NQ 0 
                THEN                   # CON STILL EXISTS IN SEC APP   #
                  BEGIN 
                  ACNBPRAF[0] = TRUE;  # SET PRI APP FAILED FLAG       #
                  END 
                P<ACNT> = OLDACNT;     # RESTORE ACNT ADR OF FAILED APP#
                END                        # LOANED CONN. EXIT         #
              END                          # IN-ACTIVE ENTRY           #
            END                          # CALL HC STATE TABLE         #
        IF ACBFNTW0[0] NQ 0 
        THEN
          BEGIN                        # FILE LOANNING EXISTED         #
          IF ACBFNTMAS[0] 
          THEN
            PARAMS1 = TMAB ;           # MASTER HAS FAILED             #
          ELSE
            PARAMS1 = TSAB ;           # ELSE IS SLAVE                 #
          PARAMS2 = ACBAN[0] ;         # AC  OF FAILED      APPLICATION#
          PARAMS3 = 0 ; 
          OVLNAME = HFNTSMP ; 
          OVLCALL ; 
          END 
  # 
        FORMAT APP/FAIL/U SM SEND TO NVF
  # 
            MGETS(LAPPF + BLKHSIZE + ABHSIZE,BLKADDR,TRUE) ;
            P<AHEADER> = BLKADDR + BLKHSIZE ; 
            ABHWORD[0] = SMABHW[0] ;
            ABHTLC[0] = LAPPF ; 
  
            P<SUPMSG> = BLKADDR + BLKHSIZE + ABHSIZE ;
  
            P<SMNVF> = P<SUPMSG> ;
            FAILAN[0] = ACBAN[0] ;
            PFCSFC[0] = FAIAPP ;
  
            BLINK(BLKADDR,ATACBA[NVFAN]) ;
            OSCHAPP(ATACBA[NVFAN]) ;
            ATNVFF[ACBAN[0]] = TRUE; # SET WAITING FOR FAIL/APPL/N     #
            END                # SEND APPL/FAIL/U TO NVF               #
          END                      # APPLICATION NETTED ON O.K.        #
        IF KDAM[0] # NAM K DISPLAY IN APPLICATION MODE                 #
          AND KDAN[0] EQ ACBAN[0] # ASSIGNED TO FAILED APPLICATION     #
        THEN # CLEAN UP NAM K DISPLAY TABLES                           #
          BEGIN 
          OVLNAME = KPCLNUPP; 
          OVLCALL;
          END 
        IF NOT KDAM[0]         # KDISPLAY IN NAME MODE                 #
        THEN
          BEGIN 
          IF KDNAL[0] GR 0     # SOME APPL IN ALERT                    #
          THEN
            BEGIN              # CHECK IF THIS IS THE ONE IN ALERT     #
            HWHERE = 0; 
            P<HALTNR> = LOC(KAPALT1[0]);
            FOR HINDEX = 1 STEP 1 WHILE HWHERE EQ 0 AND HINDEX LQ 
                         KMAXALT
            DO
              BEGIN 
              IF HALTN[HINDEX] EQ FAILANAME # IF NAME ON ALERT BUFFER  #
              THEN                         # SAME AS FAILED APPL NAME  #
                BEGIN 
                HWHERE = HINDEX;           # MARK THE INDEX            #
                END 
              END            # END OF FOR                              #
            IF HWHERE NQ 0   # START SHIFT APPL NAMES IN ALERT BUFFER  #
            THEN
              BEGIN 
              FOR HINDEX = HWHERE STEP 1 UNTIL KMAXALT -1 
              DO
                BEGIN 
                HALTN[HINDEX] = HALTN[HINDEX + 1];
                END 
              KAPALT5[0] = " "; 
              GOTO HHN[HWHERE]; 
      HM:    ;
      HA:    KDALAN1[0] = KDALAN2[0]; 
      HB:    KDALAN2[0] = KDALAN3[0]; 
      HC:    KDALAN3[0] = KDALAN4[0]; 
      HD:    KDALAN4[0] = KDALAN5[0]; 
      HHE:   KDALAN5[0] = 0;
             KDNAL[0] = KDNAL[0] - 1; 
             END             # END OF APPL SHIFT                       #
           END               # END OF SOME KAPPL                       #
         END                 # END OF KDAM                             #
       END                   # END OF NON-ZERO ACB ADDRESS             #
      FAILADR = 0 ;          # APPL/FAILURE PROCESSED                  #
      GOTO RJMAIN;           # RETURN TO CALLING PROGRAM               #
      END 
TERM
