*DECK DB$TRU
USETEXT CDCSCTX 
      PROC DB$TRU;
      BEGIN 
 #
* *   DB$TRU  TERMINATE RUN UNIT                 PAGE  1
* *   C O GIMBER                                 11/18/76 
* 
* DC  PURPOSE 
* 
*     TERMINATE USER AND DELETE ALL TQT ENTRIES FOR THAT USER.
* 
* DC  ENTRY CONDITIONS
* 
*     TQT AND RCB SET TO RUN UNIT TO BE TERMINATED. 
*     TQARTX IS NOT EQUAL TO 0 IF THE RUN-UNIT IS IN TRANSACTION MODE.
* 
* DC  CALLING ROUTINES
* 
*     DB$ERR                 ERROR PROCESSOR
*     DB$IREC                INPUT RECEIVER 
*     DB$SFCL                GENERATE AND ISSUE SFCALL
* 
* DC  CALLED ROUTINES 
# 
      XREF PROC DB$ACM;      #ACCOUNT MESSAGE PROCESSOR#
      XREF PROC DB$ERR;      #ERROR PROCESSOR#
      XREF PROC DB$FLOP;     #GENERATE FLOW POINT#
      XREF PROC DB$RCBC;     #RCB CREATOR#
      XREF PROC DB$SCHT;     #SET TQT BASED COMMON CELLS# 
      XREF PROC DB$SFCL;     #SFCALL PROCESSOR# 
      XREF PROC DB$TQTD;     #DELETE TQT ENTRY# 
      XREF PROC DB$TQTT;     #SET UP TQT FOR TERMINATION# 
      XREF PROC DB$WRP;      #WRAP UP AND DELETE RCB ENTRY# 
# 
* DC  NON-LOCAL VARIABLES 
* 
*     CDCS COMMNON
 #
# 
*     LOCAL VARIABLES.
# 
      ITEM INDEX; 
      ITEM RCBSAVED;         #SAVED RCB ADDRESS#
      ITEM RUID;             #RUID TO BE DLETED#
      ITEM  TCP=0;
      ITEM  TIO=0;
  
  
  
  
#     B E G I N   D B $ T R U   E X E C U T A B L E   C O D E .      #
  
  
 #
* DC  DESCRIPTION 
* 
*     LOOP THRU TQT ENTRIES.
 #
  
      CONTROL IFGR DFFLOP,0;
        DB$FLOP ("TRU    ");
      CONTROL ENDIF;
  
      TQTERM[0] = TRUE;            # RUN UNIT TERMINATION IN PROGRESS  #
      RUID = TQRUID[0]; 
      P<TQT> = LOC(TQTCHAIN); 
      RCBSAVED = LOC(RCB);
      FOR INDEX=INDEX WHILE TQNEXT[0] NQ 0 DO 
        BEGIN 
        P<TQT> = TQNEXT[0]; 
 #
*       IF TQT WITH RUID IN REQUEST AND LTC FLAG THEN 
*         IF NO RCB ENTRY THEN CREATE ONE.
*         SET CONTINUATION ADDRESS FOR RCB. 
 #
        IF TQRUID[0] EQ RUID AND TQLTCF[0] THEN 
          BEGIN 
          TQLTCF[0] = FALSE;
 #
*     ADD UP ALL MUJ USERS. 
 #
          TCP = TCP + TQACUMCP[0];
          TIO = TIO + TQACUMIO[0];
          IF TQRCB[0] GR 0
          THEN
            BEGIN 
            P<RCB> = TQRCB[0];
            END 
          ELSE
            BEGIN 
            DB$RCBC;
            RCFUNC[0] = 0;
            RCCONSTRA[0] = LOC(STATCOMP); 
            RCIRRUID[0] = RUID; 
            RCTQT[0] = LOC(TQT);
            TQRCB[0] = LOC(RCB);
            END 
  
          DB$TQTT(LOC(JOBEND),RCBSAVED);  # TERMINATE THE TQT          #
          RCQPOS[0] = 0;
          END  #IF RUID#
        END  #TQTLOOP#
 #
*     RESET TO TQT BEING TERMINATED.
 #
      P<RCB> = RCBSAVED;
      P<TQT> = RCTQT[0];
      DB$SCHT;                     # SET COMMON CELLS BASED ON TQT     #
  
  
      IF ACCNFLAG            # IF ACCOUNTING IS ON                     #
        AND (TCP + TIO) NQ 0
      THEN
        BEGIN 
        TQACUMCP[0] = TCP;         # SET ACCUMULATED CP AND IO CHARGES #
        TQACUMIO[0] = TIO;         # FOR THE CURRENT TQT.              #
  
        CDCSCP = CDCSCP + TCP;     # ADD THE CP AND IO TOTALS FOR THIS #
        CDCSIO = CDCSIO + TIO;     # RUN-UNIT TO THE TOTAL FOR CDCS.   #
  
        TCP = 0;                   # RESET FOR NEXT EXECUTION...       #
        TIO = 0;                   # OF DB$TRU.                        #
 #
*     SEND ACCOUNTING MESSAGES TO UCP DAYFILE.
*       FOR NOS/BE, THIS IS A MESSAGE ONLY--SINCE -PER REQUEST- CHARGES 
*         ARE TALLIED WITH EACH REQUEST.
*       FOR NOS, THIS IS INTENDED TO DO THE SYSTEM ACCOUNTING FOR THE 
*         ENTIRE RUN-UNIT.
 #
        DB$ACM; 
        END 
 #
*     IF THE RUN-UNIT IS IN TRANSACTION MODE, ISSUE AN INFORMATIVE
*     MESSAGE THAT A DROP WILL AUTOMATICALLY BE PERFORMED.
 #
      IF TQARTX[0] NQ 0 
      THEN
        BEGIN 
        DB$ERR(89);                # CONTROL WILL RETURN FROM DB$ERR   #
        END 
 #
*     TERMINATE SCP CONNECTIONS FOR THIS RUN-UNIT.
*     (ALREADY BEEN DONE BY DB$RCBQ IF THIS IS AN ABORT NOTIFICATION) 
 #
      IF RCIRSTAT[0] EQ 0 
      THEN
        BEGIN 
        DB$SFCL(DFSFENDT,0,-1,0);  # WITHOUT ACCOUNTING.               #
        END 
JOBEND: 
 #
*     DELETE THE TQT FROM THE CHAIN.
*     WRAP UP AND DELETE RCB ENTRY. 
 #
      DB$TQTD;
      DB$WRP; 
      END  #DB$TRU# 
      TERM; 
