*DECK DB$TARE 
USETEXT,CDCSCTX 
      PROC DB$TARE((OFTLOC),(CONTLOC)); 
      BEGIN 
 #
* *   DB$TARE - TERMINATE AREA USERS             PAGE  1
* *   P L KENNY                                  DATE  03/27/81 
* 
* DC  PURPOSE 
* 
*     TERMINATE ALL RUN-UNITS USING A GIVEN AREA BY ASSIGNING A NEW 
*     CONTINUATION ADDRESS. 
* 
* DC  ENTRY CONDITIONS
* 
* D   PARAMETERS
# 
      ITEM OFTLOC I;         # ADDRESS OF OFT                          #
      ITEM CONTLOC I;        # LOCATION AT WHICH USERS WILL BE CONTIN- #
                             # UED FOR COMPLETION OF THE TERMINATION.  #
                             # NORMALLY THIS WILL BE THE LOCATION OF A #
                             # FATAL DB$ERR CALL.  THIS LOCATION MUST  #
                             # BE IN THE STATIC PORTION OF MEMORY.     #
# 
* D   ASSUMPTIONS 
* 
*     SALX SET TO INDEX OF THE SCHEMA SAL ENTRY.
* 
* DC  EXIT CONDITIONS 
* 
*     FOR EACH USER WHO HAS THE GIVEN AREA OPEN, THE FOLLOWING IS DONE -
* 
*     -  THE AREA IS CLOSED, INCLUDING EXTENDED AREA REFERENCES FOR 
*        CONSTRAINT PROCESSING. 
* 
*     -  IF THE USER HAS AN ACTIVE REQUEST (TQRCB GR 0), THE RCB
*        CONTINUATION ADDRESS IS SET TO CONTLOC.
* 
*     -  IF THE USER HAS NO ACTIVE REQUEST (TQRCB EQ 0), THE TQT RCB
*        POINTER IS SET TO THE NEGATIVE OF CONTLOC.  DB$IREC WILL HAVE
*        THE USER CONTINUE AT CONTLOC WHEN THE USER"S NEXT CDCS INPUT 
*        REQUEST IS RECEIVED. 
* 
*     -  IF THE USER HAS AN OUTSTANDING ABNORMAL TERMINATION CONTINUA-
*        TION ADDRESS (TQRCB LS 0), THE USER IS IGNORED (LEFT 
*        UNCHANGED).
* 
* DC  CALLING ROUTINES
* 
*     DB$FTEX                CRM ERROR MANAGER
*     DB$UNDO                TRANSACTION ROLLBACK 
* 
* DC  CALLED ROUTINES 
# 
      XREF PROC DB$CARS;     # CONTROL AUTO RECOVERY SEQUENCE          #
      XREF FUNC DB$CLOU B;   # DETERMINE IF TQT USES THE GIVEN AREA    #
                             #   IF SO, CLOSE IT.                      #
      XREF PROC DB$DUMP;     # TAKE A MEMORY DUMP                      #
      XREF PROC DB$ERR;      # PROCESS USER ERROR                      #
      XREF PROC DB$FLOP;     # GENERATE FLOW POINT                     #
      XREF PROC DB$MSG;      # SEND A DAYFILE MESSAGE                  #
      XREF PROC DB$SCHT;     # SET BASE POINTERS FROM THE TQT          #
      XREF PROC DB$TQTT;     # TERMINATE THE CURRENT TQT               #
      XREF PROC DB$WRP;      # TERMINATE THE CURRENT REQUEST (WRAP)    #
# 
* DC  NON-LOCAL VARIABLES MODIFIED
* 
*     P<RCB> AND P<TQT> ARE TEMPORARILY CHANGED, THEN RESTORED. 
* 
*     TQRCB - TQT RCB POINTER 
*     RCCONTA - RCB CONTINUATION ADDRESS
* 
*     FSTT
*       FSFTERR - FSTT FIELD FOR FATAL ERROR ON ONE FIT 
 #
      XREF ITEM ROLLABLE B;  # TRUE IF CDCS CAN BE ROLLED OUT          #
      CONTROL NOLIST;        # *CALL AAMARRDEF AND AAMFSTT FROM AAM PL #
*CALL AAMARRDEF 
*CALL AAMFSTT 
      CONTROL LIST; 
 #
  
* DC  LABELS DEFINED AS EXTERNAL
# 
      XDEF LABEL DB$CRER;    # LABEL FOR ABORTING USERS OF AN UNUSABLE #
                             # AREA DUE TO CRM FATAL FILE ERROR        #
      XDEF LABEL DB$RBER;    # LABEL FOR ABORTING USERS OF AN UNUSABLE #
                             # AREA DURING TRANSACTION ROLLBACK        #
                             # (DB$RBER MUST RESIDE IN STATIC MEMORY)  #
      XDEF ITEM TAKEDMP B=TRUE;  # FLAG TRUE IF DUMP SHOULD BE TAKEN   #
# 
* DC  DESCRIPTION 
* 
*     -  SAVE LOCATION OF CURRENT RCB.
* 
*     -  SEARCH THROUGH THE TQT CHAIN FOR USERS HAVING THE GIVEN AREA 
*        OPEN.  CLOSE THE OPEN FILE INSTANCES.
*        FOR EACH SUCH USER, PROCESS AS STATED IN THE EXIT CONDITONS. 
* 
*     -  ENTER SYSTEM RECOVERY ROUTINES TO RECOVER THE SPECIFIED AREA.
* 
*     -  RETURN CONTROL TO THE CALLING ROUTINE.  (NOTE - THE
*        MODIFICATION OF THE CONTINUATION ADDRESS WORKS ONLY FOR RUN
*        UNITS OTHER THAN THE CURRENT RUN UNIT.  IF DB$TARE IS CALLED 
*        DURING EXECUTION OF A USER REQUEST, THE CALLING ROUTINE ITSELF 
*        MUST DIRECT THAT USER TO CONTLOC.) 
* 
 #
  
#     LOCAL VARIABLES                                                  #
  
      ITEM ABTF  B;          # TRUE IF COULD NOT RECOVER THE AREA      #
      ITEM INDEX I;          # FOR LOOP INDEX                          #
      ITEM INPROG B = FALSE; # TRUE IF TERMINATION ALREADY IN PROGRES  #
      ITEM INUSE B;          # TRUE IF AREA IN USE BY THE USER         #
      ITEM OLDRCB I;         # ADDRESS OF OLD RCB                      #
  
  
#     LOCAL VARIABLES REFERENCED EXTERNALLY                            #
  
      XDEF ITEM DB$TARN = 0;       # TERMINATING AREA ID NUMBER        #
      XDEF ITEM DB$TARV C(7);      # TERMINATING AREA VERSION NAME     #
  
  
  
  
#     S T A R T   O F   D B $ T A R E   E X E C U T A B L E   C O D E  #
  
  
      CONTROL IFGR DFFLOP,0;
        DB$FLOP("TARE");     # GENERATE A FLOW POINT                   #
      CONTROL ENDIF;
  
      ROLLABLE = FALSE;      # INHIBIT CDCS ROLL OUT                   #
  
      IF INPROG              # IF AN AREA TERMINATION IS IN PROGRESS   #
      THEN                   # DOWN THE SCHEMA                         #
        BEGIN 
        SASCHST[SALX] = S"ERRDOWN"; 
        GOTO TAREEXIT;
  
        END 
      INPROG = TRUE;
      IF TAKEDMP
      THEN
        BEGIN 
        DB$DUMP(0,O"377777");  # DUMP THE CDCS FIELD LENGTH            #
        DB$MSG("  FIELD LENGTH DUMP IS ON THE OUTPUT FILE:"); 
        TAKEDMP = FALSE;     # TAKE ONLY ONE DUMP AT MOST              #
        END 
  
                             # AREA IS MARKED DOWN BEFORE STARTING TO  #
                             # CLOSE THE OPEN INSTANCES.               #
                             # THIS PREVENTS DB$CLSA FROM ATTEMPTING   #
                             # TO WRITE A LOG RECORD, AND MAKES THE    #
                             # OPERATION NON-INTERRUPTIBLE.            #
      P<OFT> = OFTLOC;
      OFSTATUS[0] = S"ERRDOWN"; 
  
      P<UFT> = LOC(OFUFT[0]); 
      P<FSTT$AA> = UFFITFSTT; 
      FSFTERR[0] = 0;        # CLEAR THE FSTT FLAG FOR ERROR IN FIT    #
  
      OLDRCB = LOC(RCB);     # SAVE LOCATION OF CURRENT RCB            #
      P<TQT> = TQTCHAIN;
  
      FOR INDEX = INDEX WHILE TQNEXT[0] NQ 0 DO 
        BEGIN 
        IF TQSALX[0] EQ SALX
        THEN                 # SCHEMA MATCH                            #
          BEGIN 
          IF DB$CLOU(OFTLOC) # SEARCH FOR ACTIVE UFT'S FOR THIS AREA,  #
                             # CLOSE THEM, AND RETURN "TRUE" IF ANY    #
                             # ARE FOUND.                              #
  
          THEN               # USER HAD THIS AREA OPEN.                #
            BEGIN 
            DB$TQTT(CONTLOC,OLDRCB);  # TERMINATE THE TQT              #
            END 
          END 
        P<TQT> = TQNEXT[0]; 
        END                  # END FOR-LOOP                            #
  
#     CALL SYSTEM RECOVERY ROUTINES                                    #
  
      P<OFT> = OFTLOC;
      OFSTATUS[0] = S"UP";   # SET STATUS TO "UP" AT THE BEGINNING OF  #
                             # THE RECOVERY SEQUENCE.                  #
  
      DB$TARN = OFARID[0];   # SPECIFY THE AREA ID.                    #
      DB$TARV = OFVENAME[0];
      DB$CARS(ABTF,SALX+1);  # CALL AUTO RECOVERY FOR THE              #
                             # SPECIFIED AREA.                         #
 TAREEXIT:  
      P<OFT> = OFTLOC;
                             # IF EITHER THE SCHEMA OR THE AREA WAS    #
                             # MARKED DOWN, THE RECOVERY FAILED.       #
                             # DOWN THE SCHEMA SO THAT ALL OF THE LOG  #
                             # FILES WILL BE PRESERVED.                #
      IF OFSTATUS[0] EQ S"ERRDOWN"
      THEN
        BEGIN 
        SASCHST[SALX] = S"ERRDOWN"; 
        END 
      IF SASCHST[SALX] NQ S"ERRDOWN"
      THEN
        BEGIN 
                             # AREA IS MARKED DOWN EVEN THOUGH THE     #
                             # RECOVERY WAS SUCCESSFUL.                #
                             # THIS PREVENTS AN UP/DOWN LOOP FROM      #
                             # OCCURRING, AND REQUIRES AN OPERATOR     #
                             # ACKOWLEDGEMENT OF THE PROBLEM.          #
        OFSTATUS[0] = S"DOWN";
  
        DB$MSG("    AREA RECOVERY IS COMPLETE.:");
        DB$MSG("    THE AREA IS LEFT IN DOWN STATUS.:");
        DB$MSG("    TO REGAIN THE USE OF THE AREA:"); 
        DB$MSG("    USE THE -UP- COMMAND.:"); 
  
        END 
      ELSE
        BEGIN 
        DB$MSG("    AREA RECOVERY FAILED.:"); 
        DB$MSG("    THE SCHEMA IS PUT IN DOWN STATUS.:"); 
        END 
  
      P<RCB> = OLDRCB;       # RESET RCB POINTER                       #
      P<TQT> = RCTQT[0];     # RESET TQT POINTER                       #
      INPROG = FALSE; 
      DB$SCHT;               # SET BASE POINTERS FROM THE TQT          #
  
      RETURN; 
  
  
  
#**********************************************************************#
#                                                                      #
#     THE FOLLOWING CODE IS USED AS THE CONTINUATION ADDRESS FOR       #
#     REDIRECTING USERS OF A PARTICULAR VERSION OF A PARTICULAR AREA.  #
#     IT IS NOT EXECUTED AS PART OF DB$TARE ITSELF, BUT WILL BE        #
#     EXECUTED WHEN THE CDCS SCHEDULER STARTS UP A RUN UNIT AFTER AN   #
#     INTERRUPTION OR UPON RECEIVING A NEW REQUEST FROM THE RUN UNIT.  #
#     (THE CODE IS LOCATED IN DB$TARE BECAUSE IT MUST RESIDE IN STATIC #
#     MEMORY, AND THE ROUTINES WHICH CALL DB$TARE MIGHT NOT RESIDE IN  #
#     THE CDCS (0,0) OVERLAY.)                                         #
#                                                                      #
#**********************************************************************#
  
DB$CRER:  
  
      CONTROL IFGR DFFLOP,0;
        DB$FLOP("TARE-S1");  # GENERATE A FLOW POINT - SCHED 1         #
      CONTROL ENDIF;
  
      DB$ERR(10);            # AREA DOWN DUE TO CRM FATAL FILE ERROR   #
                             # FATAL ERROR - NO RETURN                 #
      DB$WRP; 
  
  
DB$RBER:  
  
      CONTROL IFGR DFFLOP,0;
        DB$FLOP("TARE-S2");  # GENERATE A FLOW POINT - SCHED 2         #
      CONTROL ENDIF;
  
      DB$ERR(78);            # AREA UNUSABLE DURING DB$UNDO PROCESSING #
                             # FATAL ERROR - NO RETURN                 #
      DB$WRP; 
  
      END 
      TERM
