*DECK DB$TERM 
USETEXT CDCSCTX 
  PROC DB$TERM; 
  BEGIN 
 #
* *   DB$TERM    TERMINATE CDCS                  PAGE  1
* *   W P CEAGLIO                                DATE  2/12/76
* * 
* DC  PURPOSE 
* 
*     PERFORM ALL NECCESSARY OPERATIONS PURSUANT TO TERMINATING CDCS
*     AS AN ACTIVE SUBSYSTEM AT A SYSTEM CONTROL POINT.  THESE ARE--
* 
*       .   CLOSE SWAP FILE AND MASTER DIRECTORY. 
*       .   OUTPUT CM AND ACCOUNTING STATISTICS TO THE CDCS DAYFILE.
* 
* DC  ENTRY CONDITIONS
* 
* DC  EXIT CONDITIONS 
* 
*     IF A LAST MILLISECOND USER REQUEST IS DETECTED BY DB$SELF, NONE 
*     OF THE DB$TERM FUNCTIONS ARE PERFORMED. 
*     WHEN NORMAL FUNCTIONS ARE PERFORMED DB$TERM DOES NOT RETURN BUT 
*     RELINQUISHES SCP STATUS AND STOPS EXECUTION OF CDCS.
* 
* DC  CALLING ROUTINES
* 
*           DB$MTR    CDCS MONITOR
* 
* DC  CALLED ROUTINES 
# 
      XREF PROC DB$ACM1;     # OUTPUT CP/IO STATISTICS TO CDCS DAYFILE #
      XREF FUNC DB$CDEB C(10);  # INTEGER TO DECIMAL W/ LEADING BLANKS #
      XREF FUNC DB$COCB C(10);  # INTEGER TO OCTAL WITH LEADING BLANKS #
      XREF PROC DB$FLRP;     # FLOW POINT REPORT WRITER                #
      XREF PROC DB$GOTO;     # GO TO A VARIABLY SPECIFIED ADDRESS      #
      XREF PROC DB$LINE;     # WRITE A LINE TO THE OUTPUT FILE         #
      XREF FUNC DB$MGSS I;   # GET CMM SUMMARY STATISTICS              #
      XREF PROC DB$MSG;      # ISSUE DAYFILE MESSAGE                   #
      XREF FUNC DB$SELF B;   # ISSUE CALLSS TO OWN SUBSYSTEM           #
      XREF PROC DB$SFCM;     # SFCALL MACRO                            #
      XREF PROC DB$WCLS;     # CLOSE WORD ADDRESSABLE FILE             #
      XREF PROC DB$WRTR;     # WRITE RECORD (FLUSH BUFFER)             #
# 
* DC  NON-LOCAL VARIABLES 
* 
*     CDCS COMMON 
* 
* DC  DESCRIPTION 
* 
*     CALL DB$SELF TO CLOSE THE INPUT REGISTER TO ANY FURTHER REQUESTS. 
*     IF ANOTHER REQUEST IS ALREADY RECEIVED, RETURN TO DB$MTR TO 
*     DISPOSE OF IT.
*     ISSUE THE SFCALL TO TERMINATE SYSTEM CONTROL POINT STATUS.
*     CLOSE THE MASTER DIRECTORY FILE.
*     FLUSH THE CDCS OUTPUT FILE. 
*     PRODUCE EXECUTION STATISTICS. 
*     IF A REPRIEVE HAS OCCURRED, RETURN TO RECOVR. 
*         NOTE.  A REPRIEVE AND NORMAL TERMINATION ONLY OCCUR IN
*                CDCSBTF. 
*     STOP EXECUTION OF CDCS. 
* 
 #
  
  
# EXTERNAL REFERENCES                                                  #
  
      XREF ITEM CMMSBI I;              # SMALL BLOCK INCREMENT         #
      XREF ARRAY DB$FTMD;;             #MASTER DIRECTORY FIT           #
      XREF ARRAY DB$FTSW;;             #SWAP FILE FIT                  #
      XREF ITEM DB$IRQR B;             #TRUE IF RCB READY FOR QUEUING. #
      XREF ARRAY DB$OFET;;             #CDCS OUTPUT FILE FET           #
      XREF ARRAY DB$RA0;;              #TERMINATES FTN TYPE PARM LISTS# 
      XREF ITEM DB$RCVD;               # ENTRY NON-ZERO AFTER REPRIEVE #
  
      XREF ARRAY DB$SSC;               # SYS CTL PT COMMUNICATION WORD #
        BEGIN 
        ITEM IRPOINT I(00,42,18);      # POINTER TO CURRENT INPUT AREA #
        END 
  
      XREF ARRAY SBITAB S(1);          # SMALL BLOCKS INCREMENTS TABLE #
        BEGIN 
        ITEM BOUND  I(00,00,60);       # LOWEST BOUNDARY               #
        ITEM BCOUNT I(01,00,60);       # COUNT OF GROUP ENTRIES        #
        END 
  
  
#     LOCAL VARIABLES                                                  #
  
      BASED ARRAY STATS (6);           #SUMMARY STATISTICS FOR CMM# 
        BEGIN 
        ITEM MAXMM U(0,0,60); 
        ITEM MAXFL U(1,0,60); 
        ITEM NUMCRASH U(2,0,60);
        ITEM NUMINCR U(3,0,60); 
        ITEM NUMDECR U(4,0,60); 
        ITEM NUMOVER U(5,0,60); 
        END 
      ITEM FLMSG C(34) = "    XXXXXX MAXIMUM SCM WORDS USED:";
      ITEM OVFLMSG C(35) = "    XXXXXX CMM OVERFLOW CALLS MADE:"; 
      ITEM SBIMSG C(70) = 
    " SMALL BLOCK BOUNDARY ADVANCED TO OR BEYOND XXXXXX YYYYYYY TIMES"; 
  
      ITEM XX;                         # INDUCTION VARIABLE            #
      ITEM EXIT I = DFSFEXIT;  # SF.EXIT FUNCTION                      #
      ITEM EXITU I = 0;      # DUMMY USER FOR SF.EXIT                  #
  
  
  
#     S T A R T   O F   D B $ T E R M   E X E C U T A B L E   C O D E  #
  
  
#     A CALL TO DB$SELF ISSUES A DUMMY CALL TO CDCS.                   #
#     THIS LEAVES OUR INPUT REQUEST PATH BUSY SO NO OTHER USER CAN     #
#     SEND A NEW REQUEST.                                              #
#     IF DB$SELF FINDS THAT ANOTHER USER REQUEST HAS BEEN RECEIVED     #
#     BEFORE OUR DUMMY, IT RETURNS A VALUE OF -FALSE-.                 #
#     WHEN ANOTHER REQUEST IS WAITING, RETURN TO DB$MTR TO PROCESS IT. #
  
      IF NOT DB$SELF         # ISSUE A CALLSS TO OWN SUBSYSTEM         #
      THEN
        BEGIN 
        RETURN;              # ANOTHER REQUEST WAS WAITING             #
  
        END 
      DB$IRQR = FALSE;       # PREVENT FURTHER CALLS TO DB$RCBQ        #
  
#     ISSUE AN SF.EXIT FUNCTION TO TERMINATE SCP STATUS                #
  
      DB$SFCM(LOC(EXIT));    # AVOID DB$SFCL WHICH CALLS DB$SCHD       #
  
#     WRITE SMALL BLOCK BOUNDARY MESSAGES TO THE OUTPUT FILE.          #
  
      FOR XX = 0 STEP 1 WHILE BCOUNT[XX] NQ 0 
      DO
        BEGIN 
        C<44,6>SBIMSG = DB$COCB(BOUND[0],6);
        C<50,8>SBIMSG = DB$CDEB(BCOUNT[XX],8);
        DB$LINE(SBIMSG,64); 
        BOUND[0] = BOUND[0] + CMMSBI; 
        END 
  
      CONTROL IFGR DFFLOP, 0; 
        DB$FLRP;             # PRINT FLOW POINT REPORT                 #
      CONTROL ENDIF;
  
#     FLUSH THE CDCS OUTPUT FILE.                                      #
  
      DB$WRTR(DB$OFET); 
  
#     CLOSE MASTER DIRECTORY FILE                                      #
  
       DB$WCLS(DB$FTMD,DB$RA0) ;
      DB$MSG (" CDCS SCP STATUS TERMINATED :"); 
  
#     OUTPUT CM STATISTICS                                             #
  
      P<STATS> = DB$MGSS; 
      C<0,10>FLMSG = DB$COCB(MAXFL,10); 
      DB$MSG(FLMSG);
      IF NUMOVER NQ 0 THEN
        BEGIN 
        C<0,10>OVFLMSG = DB$CDEB(NUMOVER,10); 
        DB$MSG(OVFLMSG);
        END 
  
#     OUTPUT CP AND IO STATISTICS TO SCP DAYFILE.                      #
  
      IF ACCNFLAG 
      THEN
        BEGIN 
        DB$ACM1;
        END 
  
#     IF DB$RCVD HAS BEEN CALLED, THAT INDICATES THAT ONE OF THE       #
#     CDCSBTF USERS HAS EXECUTED AN ENDRUN.                            #
#     RETURN TO RECOVR THROUGH THE DB$RCVD ENTRY POINT.                #
  
      IF DB$RCVD NQ 0 
      THEN
        BEGIN 
        DB$GOTO(LOC(DB$RCVD));
        END 
  
#     STOP EXECUTION.#
  
      STOP; 
  
  END 
      TERM
