*DECK DB$RCBF 
USETEXT CDCSCTX 
      PROC DB$RCBF; 
      BEGIN 
 #
* *   DB$RCBF  - RCB FLAGS PROCESSOR             PAGE  1
* *   BOB MCALLESTER                             DATE  02/02/81 
* 
* DC  PURPOSE 
* 
*     IDENTIFY THE END-CASE FLAGS THAT REMAIN SET FOR THE TERMINATING 
*     RCB.
*     PERFORM THE PROCESSING THAT IS REQUIRED TO CLEAR THESE FLAGS
*     AND CLEAR THEM. 
* 
* DC  ENTRY CONDITIONS
* 
* D   ASSUMPTIONS 
* 
*     P<RCB>
* 
* DC  EXIT CONDITIONS 
* 
*     THE FIELD RCFLAGS IS FALSE. 
* 
* DC  CALLING ROUTINES
* 
*     DB$TQTD                DELETE TQT 
*                              FOR PROCESSING BEFORE THE TQT IS DELETED 
*     DB$WRP                 WRAP UP RCB PROCESSING 
*                              FOR PROCESSING WHEN TQT IS NOT DELETED 
* 
* DC  CALLED ROUTINES 
# 
      XREF PROC DB$FLOP;     # RECORD A FLOW POINT                     #
      XREF PROC DB$JLCR;     # CANCEL JOURNAL LOG RESERVATIONS         #
      XREF PROC DB$RWTR;     # REWRITE RECORD                          #
      XREF PROC DB$SFCL;     # ISSUE A SUBSYSTEM FUNCTION CALL         #
      XREF PROC DB$SFRT;     # RETURN SCHEMA SYSTEM FILES              #
# 
* DC  NON-LOCAL VARIABLES MODIFIED
* 
*     RCFLAGS                END-CASE FLAGS 
* 
* DC  DESCRIPTION 
* 
*     A GROUP OF END-CASE FLAGS IS DEFINED IN THE RCB FIELD, RCFLAGS. 
*     THESE ARE INTENDED TO PREVENT THE RCB FROM TERMINATING WHILE
*     IT HAS INVOKED SOME CONDITION THAT WOULD INHIBIT THE EXECUTION
*     OF OTHER RUN UNITS. 
* 
*     DB$RCBF IS CALLED IF ANY OF THESE END-CASE FLAGS IS SET.
*     THE FLAGS ARE EACH EXAMINED AND APPROPRIATE CORRECTIVE ACTION 
*     IS TAKEN FOR EACH ONE THAT IS SET.
 #
# 
*     LOCAL VARIABLES 
# 
      ITEM FETLOC I;         # TEMPORARY STORAGE FOR FET LOCATION      #
  
      CONTROL NOLIST;        # CALL JFQUEDCLS                          #
*CALL JFQUEDCLS 
      CONTROL LIST; 
  
  
  
#     B E G I N   O F   D B $ R C B F   E X E C U T A B L E   C O D E  #
  
      CONTROL IFGR DFFLOP,0;
        DB$FLOP("RCBF");
      CONTROL ENDIF;
  
      IF RCINVI[0]
      THEN
        BEGIN 
# 
*     THE RUN-UNIT WAS TERMINATED BY DB$TRU WHILE WAITING IN DB$SFIN. 
*     SET THE SCHEMA FILE INITIALIZATION PROCEDURE COMPLETE BIT TO
*     INDICATE THAT THE PROCEDURE IS NO LONGER RUNNING AND RETURN ANY 
*     FILES THAT DB$SFIN ATTACHED.
# 
        DB$SFRT;             # RETURN SCHEMA SYSTEM FILES              #
        SASFINCOMP[SALX] = TRUE;  # DB$SFIN NOT ACTIVE                 #
        RCINVI[0] = FALSE;
        END 
  
      IF RCJLWTR[0] 
      THEN                   # RWTR-IDLE-FLAG NEEDS CLEARING           #
        BEGIN 
# 
*       THE RUN-UNIT WAS TERMINATED BY DB$TRU WHILE WAITING IN DB$RWTR. 
*       RETRIEVE THE FET LOCATION AND CALL DB$RWTR AGAIN. 
# 
        P<JFQUEUE> = SAJLFPTR[SALX];
        IF P<JFQUEUE> NQ 0
        THEN
          BEGIN 
          FETLOC = LOC(JFQFET); 
          DB$RWTR(FETLOC);   # WAIT FOR REWRITER COMPLETION            #
          END 
        RCJLWTR[0] = FALSE; 
        END 
  
      IF RCJLRS[0]
      THEN                   # JOURNAL LOG RESERVATIONS ARE IN EFFECT  #
        BEGIN 
# 
*       A JOB WAS DROPPED WHILE IT WAS PROCESSING A JOURNAL LOG FILE
*       REQUEST.
*       THE RESERVATION MUST BE CANCELLED, IF PRESENT.
# 
        IF SAJLFPTR[SALX] NQ 0
        THEN
          BEGIN 
          DB$JLCR;
          END 
        END 
  
  
      IF RCSFSWP[0] 
      THEN                   # A SWAP OUT FUNCTION HAS BEEN ISSUED     #
        BEGIN 
# 
*       CDCS HAS ISSUED AN SF.SWPO FUNCTION TO SWAP OUT THIS USER.
*       IT IS NOT MANDATORY THAT THE OPERATING SYSTEM ACTUALLY SWAP 
*       THE USER OUT WHEN THIS FUNCTION IS ISSUED.
*       THE OPERATING SYSTEM DOES RECORD THE FACT THAT THIS USER IS 
*       SUGGESTED FOR SWAP OUT. 
*       THE SF.SWPI FUNCTION CANCELS THE RECOMMENDATION FOR SWAP OUT. 
*       IT SHOULD BE ISSUED EVEN THOUGH THE USER IS NOT ACTUALLY
*       SWAPPED OUT.
# 
        IF TQTMTR NQ LOC(TQT) 
           AND TQLTCF[0]
        THEN
          BEGIN 
          DB$SFCL(DFSFSWPI,0,0,0);
          END 
        RCSFSWP[0] = FALSE; 
        END 
  
      IF RCRPTI[0]
      THEN                   # RECOVERY POINT PROCEDURE IS INTERLOCKED #
        BEGIN 
# 
*       DB$JRPT HAS LEFT THE LOG FILE IN AN INTERLOCKED STATE.
*       LOGGING CAN NOT PROCEED AGAIN UNTIL 'JFILEOK' IS TRUE.
# 
        P<JFQUEUE> = SAJLFPTR[SALX];
        IF P<JFQUEUE> NQ 0
        THEN
          BEGIN 
          JFILEOK[0] = TRUE; # SET COMPLETE TO RELEASE THE INTERLOCK   #
          END 
        RCRPTI[0] = FALSE;
        END 
  
      END 
      TERM
