*DECK DB$UFRE 
USETEXT UTMPTTX 
USETEXT UTCDFTX 
USETEXT CUGBATX 
      PROC DB$UFRE(LOCPOINT); 
  
 #
  
  *   DB$UFRE - FREE A MANAGED MEMORY BLOCK      PAGE  1
  *   STEVEN P. LEVIN                            DATE  11/07/75 
  *   BOB MCALLESTER                             DATE  03/30/84 
  
  DC  PURPOSE 
  
      FREE A MANAGED MEMORY BLOCK USED AS WORKING STORAGE, ZERO THE 
      BLOCK"S POINTER WORD, AND CALL DB$UADR TO UPDATE ADDRESS WORDS. 
  
  DC  ENTRY CONDITIONS
  
      THE PARAMETER LOCPOINT IS THE LOCATION OF A MANAGED MEMORY BLOCK
      POINTER WORD FOR AN EXISTING (ALLOCATED, BUT NOT FREED) BLOCK.
  
  DC  EXIT CONDITIONS 
  
      UPON NORMAL RETURN FROM DB$UFRE, THE MANAGED MEMORY BLOCK WHOSE 
      POINTER WORD IS LOCATED AT LOCPOINT WILL BE FREED (DEALLOCATED).
      THE POINTER WORD WILL BE ZEROED TO INDICATE THE BLOCK IS FREE.
      MANAGED MEMORY BLOCK FIRST-USABLE-ADDRESS WORDS (AS NEEDED) WILL
      BE UPDATED BY DB$UADR TO REFLECT THE CURRENT MEMORY CONDITIONS. 
      IF DB$UFRE DOES NOT RETURN NORMALLY, IT WILL BE BECAUSE IT CALLS
      DB$UABN TO HANDLE A PARAMETER ABNORMALITY (THE POINTER WORD IS
      ZERO) OR CMM ITSELF ABORTS.  THE LATTER EVENT SHOULD NOT HAPPEN.
  
  DC  CALLING ROUTINES
  
      DB$CBLD - CONDENSED SCHEMA/SUBSCHEMA TABLE BUILDER MAIN MODULE
      DB$CERR - CST BUILDER PROC TO HANDLE FATAL ERROR MESSAGE/RETURN 
  
  DC  CALLED ROUTINES 
  
      DB$MVF  - CALL CMM TO FREE A VARYING-POSITION MEMORY BLOCK
      DB$UABN - HANDLE ABNORMALITIES IN MANAGED MEMORY BLOCK MODULES
      DB$UADR - UPDATE MANAGED MEMORY BLOCK FIRST-USABLE-ADDRESS WORDS
      DB$URDS - RETURN A DISK RESIDENT TABLE SEGMENT
  
  DC  NON-LOCAL VARIABLES 
  
      THE BLOCK POINTER WORD LOCATED AT LOCPOINT WILL BE ZEROED.
      DB$UADR WILL UPDATE BLOCK FIRST-USABLE-ADDRESS WORDS, AS NEEDED.
      IF THERE ARE ANY SWAPPED OUT SEGMENTS, THE SWAPLIST WILL BE 
      ADJUSTED. 
  
  DC  DESCRIPTION 
  
      IF THE MANAGED MEMORY BLOCK POINTER WORD IS ZERO, CALL DB$UABN. 
      IF THERE ARE SWAPPED OUT SEGMENTS, RELEASE THEM.
      CALL DB$MVF TO FREE THE BLOCK, AND ZERO THE BLOCK POINTER WORD. 
      CALL DB$UADR TO UPDATE MEMORY BLOCK ADDRESS WORDS, AND RETURN.
 #
  
  
  
        BEGIN                # DB$UFRE #
  
# THE FOLLOWING FORMAL PARAMETER IS PASSED TO DB$UFRE # 
  
        ITEM LOCPOINT U;     # LOCATION OF MEMORY BLOCK POINTER WORD #
  
# THE FOLLOWING ARE EXTERNALLY REFERENCED PROCEDURES #
  
        XREF PROC DB$MABI;   # DBMSTRD INTERNAL ERROR ABORT          #
        XREF PROC DB$MVF;    # CALL CMM TO FREE A VARY-POSITION BLOCK#
        XREF PROC DB$UADR;   # UPDATE MANAGED MEMORY USABLE ADDRESSES#
        XREF PROC DB$URDS;   # RELEASE DISK RESIDENT SEGMENTS        #
  
# LOCAL VARIABLES # 
  
        ITEM XA;             # INDUCTION VARIABLE                   # 
  
  
  
  
#     B E G I N   D B $ U F R E   E X E C U T A B L E   C O D E .      #
  
  
# IF THE MANAGED MEMORY BLOCK POINTER WORD IS ZERO, CALL DB$UABN #
  
        P<GETENTRY> = LOCPOINT;        # POINT TO BLOCK POINTER WORD #
        IF GETUNSIG[0] EQ 0 
        THEN
          BEGIN 
          DB$MABI("DB$UFRE");          # NO RETURN                     #
          END 
  
# 
*     IF IT IS A LIMITED TABLE, RELEASE DISK SEGMENTS IF THEY ARE 
*     PRESENT.
# 
        P<TLC> = B<42,18>GETUNSIG[0];  # POINT TO TLC HEADER           #
        IF TLCCT[0] 
        THEN
          BEGIN 
          FOR XA = TLCHLEN[0] -1 STEP -1 UNTIL DFTLCHL
          DO
            BEGIN 
            DB$URDS(XA);
            END 
          TLCDSOR[0] = 0;        # DISK SEGMENT ORDINAL              #
          TLCHLEN[0] = DFTLCHL; 
          END 
  
# CALL DB$MVF TO FREE THE BLOCK, AND ZERO THE BLOCK POINTER WORD #
  
        XCALL DB$MVF(B<42,18> GETUNSIG[0]);      # DB$MVF CALLS CMM # 
        GETUNSIG[0] = 0;     # ZERO THE MEMORY BLOCK POINTER WORD # 
  
# CALL DB$UADR TO UPDATE MEMORY BLOCK ADDRESS WORDS, AND RETURN # 
  
        XCALL DB$UADR;       # UPDATE MANAGED MEMORY USABLE ADDRESSES#
  
        RETURN;              # THE MANAGED MEMORY BLOCK IS NOW FREED #
  
        END                  # DB$UFRE #
  
      TERM
