*DECK DB$RLSP 
USETEXT CDCSCTX 
      PROC DB$RLSP; 
      BEGIN 
 #
* *   DB$RLSP -- DBP FILE RELEASE PROCESSOR      PAGE  1
* *   W P CEAGLIO                                DATE  03/01/79 
* * 
* 
* DC  PURPOSE 
* 
*     RELEASE (RETURN) DBP FILE FOR A SPECIFIED SCHEMA
* 
* DC  ENTRY CONDITIONS
* 
*     SALX (CDCSCOMMN) - CONTAINS INDEX OF ENTRY IN THE SAL 
* 
* DC  EXIT CONDITIONS 
* 
*     THE DATA BASE PROCEDURE LIBRARY FILE IS RETURNED TO PFM.  IN
*     ADDITION, ANY LOADED DBPS ARE UNLOADED.  THE DBP LIST IS RELEASED 
*     UNLESS AN INVOKE IS IN PROGRESS 
* 
* DC  CALLING ROUTINES
* 
*     DB$LTSB      SUBSCHEMA LONG-TERM INVOKE PROCESSOR 
*     DB$LTSC      SCHEMA LONG-TERM INVOKE PROCESSOR
*     DB$PST       PURGE SYSTEM TABLES
* 
* DC  CALLED ROUTINES 
* 
# 
      XREF PROC DB$DBPU;           # UNLOAD FDL CAPSULE                #
      XREF FUNC DB$DBPX I;         # UNLOAD FDL GROUP DIRECTORY        #
      XREF PROC DB$MFF;            # FREE CMM BLOCK                    #
      XREF PROC DB$PUNT;           # CDCS INTERNAL ERROR               #
      XREF PROC DB$RTN;            # RETURN DATA/INDEX FILE            #
# 
* 
* DC  NON-LOCAL VARIABLES MODIFIED
* 
*     P<APL>       POINTER TO APL (CDCSCOMMN) 
* 
*     APLX         INDEX INTO APL (CDCSCOMMN) 
* 
* DC  DESCRIPTION 
* 
*     SET THE APL POINTER USING THE VALUE RECORDED IN THE SAL ENTRY 
*     IDENTIFIED BY SALX.  IF IT IS NON-ZERO, STEP THRU THE APL, AND
*     FOR EACH ENTRY, UNLOAD THE THE PROCEDURE (FDL CAPSULE).  IF THE 
*     APL WAIT COUNT IS ZERO (INDICATING NO INVOKE IN PROGRESS), THEN 
*     RELEASE THE PROCEDURE LIST AND RETURN THE SPACE TO CMM. 
* 
 #
# 
*     LOCAL VARIABLES 
# 
      ITEM ERRCODE I;              # FDL ERROR CODE                    #
  
  
  
#     S T A R T  O F  D B $ R L S P  E X E C U T A B L E  C O D E      #
  
      IF SAASLPTR [SALX] EQ 0 
        AND SADBPPTR [SALX] NQ 0
      THEN
        BEGIN 
        P<APL> = SADBPPTR [SALX];  # SET APL POINTER                   #
        FOR APLX=APDBPSZ [0] STEP -1   # UNLOAD ACTIVE DBPS            #
          UNTIL 1 
        DO
          BEGIN 
          IF APEPADD [APLX] GR DFMAXDBPERR
          THEN
            BEGIN 
            DB$DBPU(APWORD0[0],LOC(APDBPNAM[APLX]));
            END 
          END 
        IF APWAITCT [0] EQ 0
        THEN
          BEGIN 
          DB$RTN(APDBPLFN[0]);     # RETURN DBP FILE                   #
          ERRCODE = DB$DBPX(APWORD0[0]);  # UNLOAD GROUP DIRECTORY     #
          IF ERRCODE GR 2 
          THEN
            BEGIN 
            DB$PUNT("DB$RLSP 1"); 
            END 
          DB$MFF(P<APL>);          # FREE CM SPACE FOR DBP LIST        #
          SADBPPTR [SALX] = 0;     # SET POINTER IN SAL ENTRY TO ZERO  #
          END 
        END 
      END 
      TERM
