*DECK DB$UADR 
USETEXT UTMPTTX 
USETEXT UTCDFTX 
      PROC DB$UADR; 
 #
  *   DB$UADR - UPDATE MM BLOCK ADDRESS WORDS    PAGE  1
  *   STEVEN P. LEVIN                            DATE  11/11/75 
  
  DC  PURPOSE 
  
      UPDATE MANAGED MEMORY BLOCK FIRST-USABLE-ADDRESS WORDS. 
  
  DC  ENTRY CONDITIONS
  
      THE COMMON ITEM OVLLEVEL HAS THE CURRENT OVERLAY LEVEL NUMBER.
      THE MANAGED MEMORY BLOCK POINTER WORDS IN COMMON FOR BLOCKS USED
      BY THE CURRENT UTILITY OVERLAY SHOULD HAVE VALID VALUES.  THE 
      COMMON MEMORY MANAGER MAINTAINS THESE WORDS FOR EXISTING BLOCKS.
  
  DC  EXIT CONDITIONS 
  
      UPON NORMAL RETURN FROM DB$UADR, MANAGED MEMORY BLOCK 
      FIRST-USABLE-ADDRESS WORDS IN COMMON FOR BLOCKS USED BY THE 
      CURRENT UTILITY OVERLAY WILL HAVE BEEN REEVALUATED.  EACH 
      REEVALUATED FIRST-USABLE-ADDRESS WORD WILL CONTAIN AN ADDRESS 
      THAT IS ONE MORE THAN THE ADDRESS IN THE BLOCK POINTER WORD.
      THE NEW FIRST-USABLE-ADDRESS WORD VALUES WILL, OF COURSE, ONLY
      BE MEANINGFUL FOR EXISTING (ALLOCATED, BUT NOT FREED) BLOCKS. 
  
  DC  CALLING ROUTINES
  
      DB$UADR SHOULD BE CALLED WHENEVER IT IS POSSIBLE THAT CMM HAS 
      MOVED MANAGED MEMORY BLOCKS AND BLOCK FIRST-USABLE-ADDRESS
      WORD VALIDITY MUST BE ENSURED.  THUS, DB$UADR SHOULD BE CALLED
      BOTH BY BLOCK HANDLER ROUTINES WHICH CALL (INTERFACES TO) CMM 
      AND BY ROUTINES WHICH CALL OTHER INTERFACES THAT MAY CALL CMM.
      FOR EXAMPLE, ROUTINES WHICH CALL CYBER RECORD MANAGER (CRM) OR
      WHICH CALL DDL DIRECTORY ACCESS ROUTINES (WHICH CALL CRM WHICH
      CALLS CMM) SHOULD ALSO CALL DB$UADR FOR ADDRESS WORD VALIDITY.
      THE FOLLOWING MANAGED MEMORY BLOCK HANDLER MODULES CALL DB$UADR:  
      DB$UALC - ALLOCATE A MANAGED MEMORY BLOCK FOR WORKING STORAGE 
      DB$UAWS - ADJUST THE WORK SPACE USABLE IN A MANAGED MEMORY BLOCK
      DB$UFRE - FREE A MANAGED MEMORY BLOCK USED AS WORKING STORAGE 
      DB$USHR - SHRINK A MANAGED MEMORY BLOCK TO JUST A 1-WORD HEADER 
      THE FOLLOWING CST BUILDER MODULES (IN MD UTILITY) CALL DB$UADR: 
      DB$CGSB - CST BUILDER ENTRY POINT IN DB$CGSD, GET FROM SUBSCHEMA
      DB$CGSC - CST BUILDER ENTRY POINT IN DB$CGSD, GET FROM SCHEMA 
      DB$CNSC - CST BUILDER PROC TO USE AN ENTRY NAME FOR A SCHEMA GET
      DB$COPN - CST BUILDER PROC TO OPEN SUBSCHEMA AND SCHEMA FILES 
      DB$CPRE - CST BUILDER PROC TO PREPARE TO BUILD WORK BLOCKS
      DB$CPUT - CST BUILDER PROC TO PUT CORE WORDS IN MASTER DIRECTORY
      DB$CREC - CST BUILDER PROC TO BUILD A RECORD WORK BLOCK IN CORE 
  
  DC  CALLED ROUTINES 
  
      NO ROUTINES ARE CALLED BY DB$UADR.
  
  DC  NON-LOCAL VARIABLES 
  
      MANAGED MEMORY BLOCK FIRST-USABLE-ADDRESS WORDS IN COMMON FOR 
      BLOCKS USED BY THE CURRENT UTILITY OVERLAY ARE REEVALUATED. 
  
  DC  DESCRIPTION 
  
      SET EVERY MANAGED MEMORY BLOCK FIRST-USABLE-ADDRESS WORD IN 
      COMMON FOR BLOCKS USED BY THE CURRENT UTILITY OVERLAY TO THE
      ADDRESS PORTION OF THE CORRESPONDING BLOCK POINTER WORD PLUS 1. 
      THUS, AFTER REEVALUATION THE FIRST-USABLE-ADDRESS WORD POINTS TO
      THE WORD AFTER THE BLOCK HEADER FOR AN EXISTING MEMORY BLOCK. 
      NOTE THAT NOT ALL MANAGED MEMORY BLOCKS (THAT IS, BLOCK POINTER 
      WORDS) HAVE A CORRESPONDING BLOCK FIRST-USABLE-ADDRESS WORD.
 #
        CONTROL EJECT;
  
        BEGIN                # DB$UADR #
  
        CONTROL NOLIST;      # UNLISTED COMDECKS: UTCDFDCLS UTMPTDCLS#
        CONTROL LIST;        # RESUME THE LISTING OF THE SOURCE CODE #
  
# ******************************************************************** #
  
# SET EVERY MANAGED MEMORY BLOCK FIRST-USABLE-ADDRESS WORD (THE WORD #
# GENERALLY USED TO BASE TABLE AND WSA ARRAYS) FOR BLOCKS USED BY THE#
# CURRENT UTILITY OVERLAY TO THE ADDRESS PORTION OF THE CORRESPONDING#
# BLOCK POINTER WORD (THE WORD USED BY CMM) PLUS ONE (FOR THE HEADER)#
  
        IF OVLLEVEL EQ 3     # CHECK IF THIS IS CST BUILDER OVERLAY # 
          THEN               # UPDATE ADDRESS WORDS CST BUILDER USES #
            BEGIN 
              CALADDR  = B<42,18> CALPOINT + 1;  # CONSTRNT AREA LIST#
              CITADDR  = B<42,18> CITPOINT + 1;  # CONSTR INTEG TABLE#
              DBPTADDR = B<42,18> DBPROCBP + 1;  # DBP TABLE BLOCK #
              EXTNADDR = B<42,18> EXTPOINT + 1;  # EXTENSION BLOCK #
              PLOKADDR = B<42,18> PLOPOINT + 1;  # PRIVACY LOCK TABLE#
              POPTADDR = B<42,18> POPPOINT + 1;  # PROC OPTION TABLE #
              SCHEADDR = B<42,18> SCHPOINT + 1;  # SCHEMA WSA BLOCK # 
              SUBSADDR = B<42,18> SUBPOINT + 1;  # SUBSCHEMA BLOCK #
              WORKADDR = B<42,18> WORPOINT + 1;  # WORK BLOCK IN CORE#
            END 
  
        RETURN;              # FIRST-USABLE-ADDRESS WORDS ARE UPDATED#
  
        END                  # DB$UADR #
  
      TERM
