*DECK DB$RLSA 
USETEXT CDCSCTX 
      PROC DB$RLSA; 
      BEGIN 
 #
* *   DB$RLSA -- ASL RELEASE PROCESSOR           PAGE  1
* *   W P CEAGLIO                                DATE  05/01/79 
* * 
* 
* DC  PURPOSE 
* 
*     RELEASE SPACE FOR THE ASL AND ITS ASSOCIATED STRUCTURES 
* 
* DC  ENTRY CONDITIONS
* 
*     ASSUMPTIONS 
* 
*     P<ASL>  SET ON ENTRY
* 
* DC  EXIT CONDITIONS 
* 
*     CMM SPACE FOR ASL AND ITS STRUCTURES (CAPSULES) IS RELEASED, AND
*     THE ASL IS DELINKED FROM THE SCHEMA CHAIN.
* 
* DC  CALLING ROUTINES
* 
*     DB$LTSB      SUBSCHEMA LONG-TERM INVOKE PROCESSOR 
*     DB$LTSC      SCHEMA LONG-TERM INVOKE PROCESSOR
*     DB$PST       PURGE SYSTEM RESOURCES FOR A RUN-UNIT
* 
* DC  CALLED ROUTINES 
* 
# 
      XREF PROC DB$LNKD;           # DELINK CMM BLOCK                  #
      XREF PROC DB$MFF;            # RETURN CMM SPACE                  #
      XREF PROC DB$PUNT;           # ABORT CDCS -- INTERNAL ERROR      #
# 
* 
* DC  NON-LOCAL VARIABLES 
* 
*     CDCS COMMON 
* 
* DC  DESCRIPTION 
* 
*     THE SPACE FOR THE CST, IF THERE IS ONE, IS RELEASED.  IF MAPPING
*     CAPSULES ARE PRESENT, THEY ARE ALSO RELEASED, AFTER WHICH THE 
*     ACTIVE CAPSULE LIST (ACL) IS RELEASED.  THE ASL IS THEN DELINKED
*     FROM THE SCHEMA CHAIN OF ASL ENTRIES. 
* 
* 
* DC  NON-LOCAL VARIABLES 
 #
      XREF ITEM SWPTC  I;          # SWAP TABLE COUNT                  #
  
      XREF ARRAY SWPSEGT;          # SWAP SEGMENT TABLE                #
        BEGIN 
*CALL SWPTDCLS
        END 
  
  
#     LOCAL VARIABLES                                                  #
  
      ITEM ACLX    I;              # SCRATCH -- FOR LOOPS              #
      ITEM PRU     I;              # PRU NUMBER OF THE CST ON SWAP FILE#
      ITEM STX     I;              # INDEX INTO SWAP SEGMENT           #
  
  
  
  
  
#     S T A R T  O F  D B $ R L S A  E X E C U T A B L E  C O D E      #
  
  
# 
*     IF THE RSB IS ON THE SWAP FILE, LOCATE ITS SWAP TABLE POINTER 
*     AND RELEASE ITS SPACE.
# 
      ACLX =0;
      IF ASCSTLOC[0] LS 0 
      THEN
        BEGIN 
        PRU = -ASCSTLOC[0]; 
        FOR STX = 1 STEP 1 UNTIL SWPTC
        DO
          BEGIN 
          IF PRU EQ SWPN[STX] 
          THEN                     # THE ENTRY IS FOUND                #
            BEGIN 
            ACLX = STX; 
            END 
          END 
        IF ACLX EQ 0
        THEN
          BEGIN 
          DB$PUNT("DB$RLSA");      # THE ENTRY WAS NOT FOUND.  ABORT.  #
          END 
                                   # SQUEEZE OUT THE SWAP TABLE ENTRY  #
        FOR STX = ACLX STEP 1 UNTIL SWPTC 
        DO
          BEGIN 
          SWWORD[STX] = SWWORD[STX+1];
          END 
  
        SWPTC = SWPTC-1;           # REDUCE THE SWAP TABLE ENTRY COUNT #
        END 
  
  
#     RELEASE THE CST IF THERE IS ONE                                  #
  
      IF ASCSTLOC[0] GR 0 
      THEN
        BEGIN 
        DB$MFF(ASCSTLOC[0]);
        END 
  
#     RELEASE MAPPING CAPSULES IF PRESENT AND THEN RELEASE ACL         #
  
      IF ASACLLOC [0] NQ 0
      THEN
        BEGIN 
        P<ACL> = ASACLLOC [0];
        FOR ACLX=ACNUMCAP[0] STEP -1
          UNTIL 1 
        DO
          BEGIN 
          IF ACCMLOC [ACLX] NQ 0
          THEN
            BEGIN 
            DB$MFF(ACCMLOC[ACLX]);
            END 
          END 
        DB$MFF(ASACLLOC[0]);
        END 
  
  
#     DELINK THE ASL FROM THE SCHEMA CHAIN                             #
  
      DB$LNKD(P<ASL>);
  
      END 
      TERM
