*DECK DB$PST
USETEXT CDCSCTX 
      PROC DB$PST;
      BEGIN 
 #
* *   DB$PST                                     PAGE 1 
* *   PURGE SCHEMA TABLES 
* *   J E ESLER                                  DATE 4/2/76
* *   A W ALLEN - DATABASE VERSIONS              DATE  01/30/81 
* *   W P CEAGLIO - SYSTEM FILE RETURN CHANGES   DATE  02/05/81 
* 
* DC  PURPOSE 
* 
*     DECREMENT COUNT OF ASL USERS. RELEASE SCHEMA TABLES THAT ARE NO 
*     LONGER NEEDED.
* 
* DC  ENTRY CONDITIONS
* 
*     TQT POINTER IS SET FOR TASK BEING DELETED.
*     TQT CONTAINS ASL AND SAL POINTERS FOR SCHEMAS TO BE CONSIDERED
*     FOR DELETION. 
* 
* DC  EXIT CONDITIONS 
* 
*     ASL USER COUNT HAS BEEN DECREMENTED.  ANY UNUSED SCHEMA TABLES
*     ARE RELEASED. 
* 
* DC  CALLING ROUTINES
* 
*     DB$TQTD    DELETE A TQT ENTRY AND ITS RESOURCES 
* 
* DC  CALLED ROUTINES 
# 
      XREF PROC DB$FLOP;     # GENERATE FLOW POINT                     #
      XREF PROC DB$MFF;      # FREE FIXED-POSITION BLOCK               #
      XREF PROC DB$RLSA;     # RELEASE ASL ENTRY                       #
      XREF PROC DB$SCHD;     # SCHEDULE OTHER TASKS WHILE WAITING      #
      XREF PROC DB$SFRT;     # RELEASE SYSTEM FILES AND ASSOC. TABLES  #
# 
* DC  NON-LOCAL VARIABLES 
* 
*     CDCS COMMON 
 #
# 
* 
*     LOCAL VARIABLES 
# 
      ITEM ACLX;             # USED FOR RELEASING CODE CAPSULES        #
      ITEM INDEX;            # INDUCTION VARIABLE                      #
*CALL QRTABDCLS 
      CONTROL EJECT;
 #
* DC  DESCRIPTION 
* 
*     IF THE TASK DOES NOT HAVE AN ASL ENTRY, RETURN. 
 #
  
      CONTROL IFGR DFFLOP,0;
        DB$FLOP("PST    "); 
      CONTROL ENDIF;
  
      IF TQASL [0] EQ 0 THEN
        RETURN; 
 #
* 
*     IF A QRF FLUSH TASK HAS NOT COMPLETED,
*       WAIT FOR IT.
 #
      IF SAQRFPTR[SALX] NQ 0
      THEN
        BEGIN 
        P<QFT> = SAQRFPTR[SALX];
        FOR INDEX = INDEX WHILE QFFLUSHF[0] 
        DO
          BEGIN 
          DB$SCHD(LOC(STATCOMP),DFWAITLOG); 
  
          CONTROL IFGR DFFLOP,0;
            DB$FLOP("PST-S1");
          CONTROL ENDIF;
  
          P<QFT> = SAQRFPTR[SALX];
          END 
        END 
 #
*     DECREMENT USER COUNT. IF OTHER USERS REMAIN, OR IF LONG-TERM
*     INVOKE IN EFFECT,RETURN.
 #
      ASNUSERS [0] = ASNUSERS [0] -1; 
      IF ASNUSERS [0] NQ 0
        OR SASCLTIF [SALX]
          OR ASLTIF [0] 
      THEN
        BEGIN 
  
        CONTROL IFGR DFFLOP,0;
          DB$FLOP("PST-1  "); 
        CONTROL ENDIF;
  
        RETURN; 
        END 
  
 #
*     NO USERS OF THE ASL REMAIN--RELEASE THE CST AND ASL 
*     IF THERE IS AN ACL, RELEASE IT AFTER RELEASING LOADED CAPSULES
 #
      DB$RLSA;
 #
*     IF ALL SUBSCHEMAS (ASL"S) HAVE BEEN RELEASED, RELEASE ALL SYSTEM
*     FILES AND ASSOCIATED TABLES.  ANY LOADED DATA BASE PROCEDURES ARE 
*     UNLOADED.  ALSO RELEASE VERSION NAME LIST.
 #
      IF SAASLPTR [SALX] EQ 0 
      THEN
        BEGIN 
        DB$SFRT;             # RETURN SCHEMA SYSTEM FILES              #
        SASFILSATT[SALX] = FALSE;  # SCH SYS FILES NO LONGER ATTACHED  #
  
        IF SAVNLPTR[SALX] NQ 0
        THEN
          BEGIN 
          DB$MFF(SAVNLPTR[SALX]);  # RELEASE VERSION NAME LIST         #
          SAVNLPTR[SALX] = 0; 
          END 
        END 
      END 
      TERM
