*DECK DB$TSCH 
USETEXT CDCSCTX 
      PROC DB$TSCH((CONTLOC));
      BEGIN 
 #
* *   DB$TSCH - TERMINATE USERS OF SCHEMA        PAGE  1
* *   C O GIMBER                                 DATE  04/11/77 
* *   C F RICHARDS  *CONTLOC* PARAMETER          DATE  12/06/78 
* *   P L KENNY - ADD ERROR LABELS               DATE  06/03/81 
* 
* DC  PURPOSE 
* 
*     TERMINATE ALL USERS OF A SCHEMA BY ASSIGNING A NEW CONTINUATION 
*     ADDRESS.
* 
* DC  ENTRY CONDITION 
* 
*     PARAMETERS
# 
      ITEM CONTLOC I;              # LOCATION AT WHICH USERS WILL BE   #
                                   # CONTINUED FOR COMPLETION OF THE   #
                                   # TERMINATION. NORMALLY THIS WILL BE#
                                   # THE LOCATION OF A FATAL DB$ERR    #
                                   # CALL. THIS LOCATION MUST BE WITHIN#
                                   # THE STATIC PORTION OF MEMORY.     #
# 
*     ASSUMPTIONS 
* 
*     SALX SET TO THE INDEX OF THE SCHEMA SAL ENTRY.
* 
* DC  EXIT CONDITIONS 
* 
*     EACH AFFECTED SCHEMA USER WITH AN RCB (TQRCB GR 0) IS GIVEN 
*     *CONTLOC* AS A CONTINUATION ADDRESS.
*     EACH AFFECTED SCHEMA USER WITH NO RCB (TQRCB EQ 0) IS GIVEN THE 
*     NEGATIVE OF *CONTLOC* AS THE LOCATION OF ITS RCB. DB$IREC WILL
*     HAVE THE USER CONTINUE AT *CONTLOC* WHEN ITS NEXT CDCS INPUT
*     REQUEST IS RECEIVED.
*     EACH AFFECTED SCHEMA USER WITH AN OUTSTANDING ABNORMAL TERMINATION
*     CONTINUATION ADDRESS (TQRCB LS 0) IS IGNORED (LEFT UNCHANGED).
*     CONTROL IS RETURNED TO THE CALLER (NOTE IF THIS ROUTINE IS CALLED 
*     DURING EXECUTION OF A USER REQUEST, THE CALLER MUST DIRECT THAT 
*     USER TO *CONTLOC*). 
* 
* DC  CALLED ROUTINES 
* 
# 
      XREF PROC DB$ERR;            # PROCESS USER ERROR                #
      XREF PROC DB$FLOP;           # GENERATE FLOW POINT               #
      XREF PROC DB$PUNT;           # CDCS INTERNAL ERROR PROCESSOR     #
      XREF PROC DB$TQTT;           # SET UP TQT TO BE TERMINATED       #
# 
* DC  CALLING ROUTINES
* 
*     DB$DSCS                      OP INTERFACE - CHANGE STATUS 
*     DB$IOER                      LOG FILE ERROR HANDLER 
*     DB$JRPT                      JOURNAL LOG RECOVERY POINT 
*     DB$UNDO                      TRANSACTION ROLLBACK 
* 
* DC  NON-LOCAL VARIABLES MODIFIED
* 
*     RCB                          CONTINUATION ADDRESS FIELD 
*     TQT                          CONTINUATION ADDRESS FIELD 
* 
*     P<RCB> AND P<TQT> ARE TEMPORARILY CHANGED AND THEN RESTORED.
* 
* DC  LABELS DEFINED AS EXTERNAL
# 
      XDEF LABEL DB$MMER;          # LABEL FOR ABORTING SCHEMA USERS IF#
                                   # CMM OVERFLOW IN TRANSAC. ROLLBACK #
      XDEF LABEL DB$TRER;          # LABEL FOR ABORTING SCHEMA USERS IF#
                                   # TRF ERROR DURING TRANSAC. ROLLBACK#
      XDEF LABEL DB$TSLE;          # LABEL FOR ABORTING SCHEMA USERS IF#
                                   # CDCS SYSTEM FILE ERROR            #
      XDEF LABEL DB$TSNL;          # LABEL FOR ABORTING SCHEMA USERS IF#
                                   # THERE IS NO AVAILABLE JOURNAL LOG #
 #
*     LOCAL VARIABLES 
# 
      ITEM RCBX;             #LOC OF RCB# 
      ITEM OLDRCB I;               # TEMPORARY FOR RESTORING RCB, TQT. #
      CONTROL EJECT;
 #
* 
* DC  DESCRIPTION 
* 
*     FOR EACH TQT ENTRY USING THE SCHEMA,
*       IF TQRCB GR 0, GIVE THE RCB *CONTLOC* AS CONTINUATION ADDRESS.
*       IF TQRCB EQ 0, SET TQRCB = -CONTLOC. (DB$IREC HANDLES IT LATER) 
*       (TQRCB LS 0 IS IGNORED. DB$IREC HASNT HANDLED IT YET.)
 #
  
      CONTROL IFGR DFFLOP,0;
        DB$FLOP ("TSCH   ");
      CONTROL ENDIF;
  
      P<TQT> = LOC(TQTCHAIN); 
      OLDRCB = LOC(RCB);           # SAVE LOCATION OF CURRENT RCB      #
      FOR OLDRCB = OLDRCB          # NO-OP FOR-LOOP HEADER             #
        WHILE TQNEXT[0] NQ TQTMTR  # WHILE MORE USER TQTS REMAIN       #
      DO
        BEGIN 
        P<TQT> = TQNEXT[0]; 
        IF TQSALX[0] EQ SALX THEN 
          BEGIN 
          DB$TQTT(CONTLOC,OLDRCB);  # TERMINATE THE TQT                #
          END 
        END 
  
      P<RCB> = OLDRCB;             # REPOSITION RCB TO ITS PRIOR LOC   #
      P<TQT> = RCTQT[0];
      RETURN; 
  
  
      CONTROL EJECT;
  
#     THE FOLLOWING LABELS ARE USED AS CONTINUATION ADDRESSES FOR      #
#     TERMINATION OF USERS OF A PARTICULAR SCHEMA.  THE FOLLOWING CODE #
#     IS NOT EXECUTED AS PART OF DB$TSCH ITSELF, BUT WILL BE EXECUTED  #
#     WHEN THE CDCS SCHEDULER STARTS UP A RUN UNIT AFTER AN INTERRUP-  #
#     TION OR UPON RECEIVING A NEW REQUEST FROM THE RUN UNIT.  (THE    #
#     CODE IS LOCATED IN DB$TSCH BECAUSE IT MUST RESIDE IN STATIC      #
#     MEMORY, AND THE ROUTINES WHICH CALL DB$TSCH MIGHT NOT RESIDE IN  #
#     THE (0,0) OVERLAY.)                                              #
  
DB$MMER:  
  
      CONTROL IFGR DFFLOP,0;
        DB$FLOP("TSCH-S1");        # GENERATE FLOWPOINT - SCHED 1      #
      CONTROL ENDIF;
  
      DB$ERR(79);                  # INSUFFICIENT MEMORY FOR ROLLBACK  #
                                   # NO RETURN                         #
  
DB$TRER:  
  
      CONTROL IFGR DFFLOP,0;
        DB$FLOP("TSCH-S2");        # GENERATE FLOWPOINT - SCHED 2      #
      CONTROL ENDIF;
  
      DB$ERR(80);                  # TRF ERROR DURING ROLLBACK         #
                                   # NO RETURN                         #
  
DB$TSLE:  
  
      CONTROL IFGR DFFLOP,0;
        DB$FLOP("TSCH-S3");        # GENERATE A FLOWPOINT - SCHED 3    #
      CONTROL ENDIF;
  
      DB$ERR(84);                  # CDCS SYSTEM FILE I/O ERROR        #
                                   # NO RETURN                         #
  
DB$TSNL:  
  
      CONTROL IFGR DFFLOP,0;
        DB$FLOP("TSCH-S4");        # GENERATE A FLOWPOINT - SCHED 4    #
      CONTROL ENDIF;
  
      DB$ERR(03);                  # NO LOG FILE AVAILABLE             #
                                   # NO RETURN                         #
  
      DB$PUNT("DB$TSCH");    # DB$ERR DOES RETURN WHEN THERE IS NO     #
                             # LONG TERM CONNECTION.                   #
                             # (INTERNAL TASK OR DURING DB$TQTD PROC)  #
      END 
      TERM; 
