*DECK DB$SFRT 
USETEXT CDCSCTX 
      PROC DB$SFRT; 
      BEGIN 
 #
* *   DB$SFRT - RETURN SYSTEM FILES              PAGE  1
* *   D E TRIGLIA/W P CEAGLIO                    DATE  01/21/81 
* 
* DC  PURPOSE 
* 
*     RETURN ALL SYSTEM FILES AND RELEASE ASSOCIATED MEMORY.
* 
* DC  ENTRY CONDITIONS
* 
* D   PARAMETERS
* 
*     NONE
* 
* D   ASSUMPTIONS 
* 
*     SALX IS SET.
* 
* DC  EXIT CONDITIONS 
* 
*     ALL SYSTEM FILES FOR THIS SCHEMA ARE RETURNED, THE ASSOCIATED 
*     BUFFERS RELEASED, AND THE POINTERS FOR THESE BUFFERS IN THE SAL 
*     ARE RESET TO ZERO.
* 
* DC  CALLING ROUTINES
* 
*     DB$PST       RELEASE SYSTEM RESOURCES (LAST INVOKE FOR A SCHEMA)
*     DB$RCBF      RCB FLAGS PROCESSOR
*     DB$RCVR      REPRIEVE/RECOVER PROCESSING
*     DB$SFIN      SYSTEM FILE INITIALIZATION (IF ERRORS) 
*     DB$WRAR      WRAPUP AUTO-RECOVERY 
* 
* DC  CALLED ROUTINES 
# 
      XREF PROC CLOSEM;            # CRM CLOSE PROCEDURE               #
      XREF PROC DB$FLOP;           # GENERATE A FLOW POINT ENTRY       #
      XREF PROC DB$MFF;            # FREE CMM BLOCK                    #
      XREF PROC DB$RA0;            # PARAMETER LIST TERMINATOR         #
      XREF PROC DB$RCLL;           # RECALL THE CPU - WAITING FOR I/O  #
      XREF PROC DB$RLSP;           # RETURN DBP FILE AMD APL           #
      XREF PROC DB$RTN;            # RETURN SYSTEM FILE                #
      XREF PROC DB$RWTM;           # REWRITER MACRO                    #
# 
* DC  NON-LOCAL VARIABLES MODIFIED
* 
*     P<APL> (VIA DB$RLSP)
* 
*     SAL 
*       SADBPPTR   POINTER TO DBP LIST
*       SAJLFPTR   POINTER TO JOURNAL LOG QUEUE 
*       SAQRFPTR   POINTER TO QRF TABLE 
*       SATRFPTR   POINTER TO TRF FET 
*       SARIDFIT   POINTER TO RESTART ID FILE FIT 
* 
*     ART 
*       ARMODFET   POINTER TO TRF MODEL FET 
* 
* DC  DESCRIPTION 
* 
*     EXAMINE EACH OF THE FIELDS (POINTERS OR FLAGS) IN THE SAL FOR THE 
*     SYSTEM FILES.  IF A FIELD IS SET, RETURN THE FILE AND RELEASE THE 
*     BUFFER ASSOCIATED WITH THE FILE.  THE RESTART IDENTIFIER FILE 
*     MUST BE CLOSED PRIOR TO RETURNING IT. 
* 
 #
      CONTROL EJECT;
  
#     LOCAL VARIABLES                                                  #
  
      BASED ARRAY FIT;             # FOR RESTART ID FILE FIT           #
*CALL FITDCLS 
  
*CALL JFQUEDCLS 
  
*CALL QRTABDCLS 
  
  
      BASED ARRAY ART;             # AUTO/RECOVERY TABLE               #
        BEGIN 
        ITEM ARMODFET   I(01,00,18);   # POINTER TO THE MODEL TRF FET  #
        END 
      CONTROL EJECT;
  
# S T A R T   O F   D B $ S F R T   E X E C U T A B L E   C O D E      #
  
  
      CONTROL IFGR DFFLOP,0;
        DB$FLOP("SFRT");
      CONTROL ENDIF;
  
#     RETURN DBP LIBRARY AND APL IF POINTER IN THE SAL IS SET, AND     #
#     CLEAR THE SAL POINTER.                                           #
  
      IF SADBPPTR[SALX] NQ 0
      THEN
        BEGIN 
        DB$RLSP;
        END 
  
#     RETURN JOURNAL LOG AND QUEUE IF POINTER IN SAL IS SET.  CLEAR THE#
#     SAL POINTER.                                                     #
  
      IF SAJLFPTR[SALX] NQ 0
      THEN
        BEGIN 
        SANOJLF[SALX] = FALSE;
        P<JFQUEUE> = SAJLFPTR[SALX];
        P<FET> = LOC(JFQFET[0]);
        IF NOT FETCOMP[0] 
        THEN
          BEGIN 
          DB$RCLL(P<FET>);
          END 
        IF FETIN[0] NQ FETOUT[0]
        THEN
          BEGIN                    # FLUSH THE BUFFER                  #
          DB$RWTM(P<FET>);
          DB$RCLL(P<FET>);
          END 
        DB$RTN(FETLFNU[0]); 
        DB$MFF(P<JFQUEUE>); 
        SAJLFPTR[SALX] = 0; 
        END 
  
#     RETURN QRF AND QRF TABLE IF POINTER IS SET IN SAL.  CLEAR THE SAL#
#     POINTER.                                                         #
  
      IF SAQRFPTR[SALX] NQ 0
      THEN
        BEGIN 
        P<QFT> = SAQRFPTR[SALX];
        DB$RTN(B<0,42>QFFET[0]);
        DB$MFF(P<QFT>); 
        SAQRFPTR[SALX] = 0; 
        END 
  
#     IF THE TRF IS PRESENT, RETURN THE FILE AND ASSOCIATED MODEL FET. #
#     ALSO, RELEASE THE ART.  CLEAR THE SAL POINTER.                   #
  
      IF SASCARF[SALX]
      THEN
        BEGIN 
        IF SAARTPTR[SALX] NQ 0
        THEN
          BEGIN 
          P<ART> = SAARTPTR[SALX];
                             # THE POINTER TO THE TRF MODEL FET IS     #
                             # HELD IN SATRFPTR DURING SYSTEM FILE     #
                             # INITIALIZATION.                         #
                             # AFTER INITIALIZATION IT IS HELD IN THE  #
                             # ART.                                    #
          IF SASFINCOMP[0]
          THEN
            BEGIN 
            P<FET> = ARMODFET[0]; 
            END 
          ELSE
            BEGIN 
            P<FET> = SATRFPTR[SALX];
            END 
          IF P<FET> NQ 0
          THEN
            BEGIN 
            DB$RTN(FETLFNU[0]); 
            DB$MFF(P<FET>); 
            END 
          DB$MFF(P<ART>); 
          SAARTPTR[SALX] = 0; 
          END 
        SATRFPTR[SALX] = 0; 
        END 
  
#     CLOSE AND RETURN THE RIF, AND RELEASE THE ALLOCATED FIT, IF THE  #
#     POINTER IS SET IN THE SAL.  CLEAR POINTER IN SAL.                #
  
      IF SARIDFIT[SALX] NQ 0
      THEN
        BEGIN 
        P<FIT> = SARIDFIT[SALX];
        CLOSEM(FIT,DFFITCFDET,DB$RA0);
        DB$RTN(FITLFN[0]);
        DB$MFF(P<FIT>); 
        SARIDFIT[SALX] = 0; 
        END 
  
      END 
      TERM; 
