*DECK DB$RCVR 
USETEXT CDCSCTX 
      PROC DB$RCVR; 
 #
* *   DB$RCVR - REPRIEVE/RECOVER PROCESSING      PAGE  1
* *   A W ALLEN, G F KENDALL                     DATE  02/19/80 
* 
* DC  PURPOSE 
* 
*     DO PROCESSING AFTER AN ABNORMAL TERMINATION OF CDCS 
* 
* DC  ENTRY CONDITIONS
* 
*     PARAMETERS               THESE PARAMETERS ARE PASSED BY OP SYS
* 
*     NONE
* 
*     ASSUMPTIONS 
* 
*     TERMFLAG IS TRUE IF TERMINATION IS ABNORMAL 
*       OR IF CDCSBTF HAS TERMINATED PREMATURELY. 
* 
*     BASED ARRAY SAL IS CORRECTLY POINTED. 
*     DATABASE AND INDEX FILES HAVE ALREADY BEEN FLUSHED BY CRM-S 
*     REPRIEVE ROUTINE. 
* 
* DC  EXIT CONDITIONS 
* 
*     IF TERMFLAG IS FALSE, 
*       DB$TERM HAS DONE THE TERMINATION PROCESSING.
*       RETURN IMMEDIATELY. 
* 
*     OTHERWISE,
*     MD, SWAP, AND OUTPUT FILES ARE CLOSED.
*     RECOVERY FILES, LOG FILES, AND PROCEDURE LIB FILES ARE RETURNED.
*     AREA AND INDEX FILES ARE RETURNED.
*     ACCOUNTING STATISTICS ARE WRITTEN TO THE CDCS DAYFILE.
* 
* DC  CALLING ROUTINES
* 
*     RECOVR  - OPERATING SYSTEM RECOVER/REPRIEVE PROCESSOR.  RECOVR
*               CALLS DB$RCVR WHEN THERE IS AN ABNORMAL TERMINATION OF
*               CDCS OR CDCSBTF.
* 
* DC  CALLED ROUTINES 
# 
      XREF PROC DB$ACM1;     # OUTPUT CP/IO STATISTICS TO CDCS DAYFILE #
      XREF PROC DB$FLRP;     # FLOW POINT REPORT WRITER                #
      XREF PROC DB$LINE;     # PRINT A LINE TO CDCS OUTPUT FILE        #
      XREF PROC DB$MSG;      # SEND A DAYFILE MESSAGE                  #
      XREF PROC DB$MSGB;     # SEND A MESSAGE TO THE B DISPLAY         #
      XREF PROC DB$RTN;      # RETURN ATTACHED PERM FILES              #
      XREF PROC DB$SFRT;     # RETURN SYSTEM FILES                     #
      XREF PROC DB$WCLS;     # CLOSE WA FILE                           #
      XREF PROC DB$WRTR;     # WRITE RECORD (FLUSH BUFFER)             #
# 
* 
*     NON-LOCAL VARIABLES 
* 
# 
      XREF ARRAY DB$FTMD;;   # MASTER DIRECTORY FIT                    #
      XREF ARRAY DB$FTSW;;   # SWAP FILE FIT                           #
      XREF ARRAY DB$OFET;;   # CDCS OUTPUT FILE FET                    #
      XREF ARRAY DB$RA0;;    # TO TERMINATE FTN TYPE PARAM LISTS       #
      XREF ITEM  FLOWPR B;   # SWITCH SIGNALS A FLOW POINT CALL        #
# 
* 
* DC  DESCRIPTION 
* 
*     IF TERMFLAG IS FALSE, RETURN. 
*     ELSE, 
*     DO CLEANUP AFTER AN ABNORMAL TERMINATION. 
*     CLOSE THE MASTER DIRECTORY FILE.
*     FLUSH THE CDCS OUTPUT FILE. 
*     RETURN LOG FILES, RECOVERY FILES, PROC LIB FILES, DATABASE FILES, 
*     AND INDEX FILES.  (CLOSING DATABASE FILES IS NOT NEEDED BECAUSE 
*     CRM HAS ALREADY FLUSHED THEM.)
*     CDCS CHARGED AND USED STATISTICS ARE WRITTEN TO THE CDCS DAYFILE
*     IF ACCOUNTING IS ON.  A CPU UTILIZATION FIGURE IS ALSO REPORTED 
*     ON NOS. 
* 
 #
  
#     LOCAL VARIABLES                                                  #
  
      ITEM INDEXO I;
      ITEM RPVMSG  C(33) = "  CDCS REPRIEVE PROCESSING DONE.:"; 
  
  
  
#     B E G I N   D B $ R C V R   E X E C U T A B L E   C O D E .      #
  
      BEGIN 
  
#     START OF EXECUTABLE CODE FOR DB$RCVR                             #
  
      IF NOT TERMFLAG 
      THEN
        BEGIN 
  
        CONTROL IFGR DFFLOP,0;
          IF FLOWPR 
          THEN
            BEGIN 
            FLOWPR = FALSE; 
            DB$MSG("      FLOW POINT REPORT:"); 
            DB$MSGB("WRITING FLOW POINT REPORT:");
            DB$FLRP;         # PRINT FLOW POINT REPORT                 #
            END 
        CONTROL ENDIF;
  
        RETURN; 
  
        END 
  
      DB$MSG("      CDCS REPRIEVE:"); 
      DB$MSGB("CDCS REPRIEVE IN PROGRESS:");
  
#     CLOSE MASTER DIRECTORY FILE                                      #
  
      DB$WCLS(DB$FTMD,DB$RA0);
  
  
#     RETURN ALL SYSTEM FILES, DATABASE FILES AND INDEX FILES.         #
  
      FOR SALX = 0 STEP 1 UNTIL SALL
      DO                     # LOOP THRU SAL ENTRIES                   #
        BEGIN 
  
        DB$SFRT;             # RETURN SYSTEM FILES                     #
  
        P<OFT> = SAOFTLSP[SALX];
        FOR INDEXO = 0 STEP 1 
          WHILE P<OFT> NQ 0 
        DO                   # LOOP THRU OFT ENTRIES                   #
          BEGIN 
#                                                                      #
#     CLOSEM OF UFT-S IS NOT REQUIRED.                                 #
#                                                                      #
#     THIS IS BECAUSE THE CRM REPRIEVE ROUTINE IN THE AAM$CTL CAPSULE  #
#     HAS ALREADY BEEN CALLED TO FLUSH ALL DATABASE AND INDEX FILES.   #
#     SO CLOSEM IS NOT NEEDED, A RETURN IS SUFFICIENT.                 #
#                                                                      #
#     THE ADDRESSES OF ALL THE REPRIEVE ROUTINES ARE CONTAINED IN A    #
#     LAST-IN FIRST-OUT STACK IN THE RECOVR MODULE.                    #
#     SINCE DB$RCVR IS PUT ON THE STACK FIRST, IT IS EXECUTED LAST.    #
#     DB$RCVR DEPENDS ON THIS SEQUENCE OF EXECUTION.                   #
#                                                                      #
          IF NOT OFDUMY[0]
          THEN
            BEGIN 
            DB$RTN(OFFITLFN[0]);   # RETURN AREA FILE                  #
            IF OFFITXN[0] NQ 0     # IF THERE IS AN INDEX FILE...      #
            THEN
              BEGIN 
              DB$RTN(OFFITXN[0]);  # RETURN INDEX.                     #
              END 
            END 
          P<OFT> = OFNEXT[0]; 
          END                # OFT LOOP                                #
  
        END                  # SCHEMA LOOP                             #
  
      CONTROL IFGR DFFLOP,0;
        DB$MSG("      FLOW POINT REPORT:"); 
        DB$MSGB("WRITING FLOW POINT REPORT:");
        DB$FLRP;             # PRINT FLOW POINT REPORT                 #
      CONTROL ENDIF;
  
  
#     OUTPUT ACCOUNTING STATISTICS TO THE CDCS DAYFILE                 #
  
      IF ACCNFLAG 
      THEN
        BEGIN 
        DB$ACM1;
        END 
  
#     PUT REPRIEVE COMPLETE MESSAGE ON DAYFILE AND ON CDCS OUTPUT FILE.#
  
      DB$MSG(RPVMSG );
      DB$LINE(RPVMSG ,32);   # LENGTH (2ND PARAM) IS ONE LESS THAN     #
                             # ACTUAL MESSAGE LENGTH TO ELIMINATE THE  #
                             # TRAILING COLON                          #
  
#     FLUSH THE CDCS OUTPUT FILE                                       #
  
      DB$WRTR(DB$OFET);      # WRITE RECORD TO FLUSH BUFFER            #
  
      RETURN;                # RETURN TO RECOVR TO RESTORE ERROR       #
                             # CONDITION AND TERMINATE JOB.            #
      END                    # DB$RCVR# 
      TERM; 
