*DECK DB$LNKS 
USETEXT CDGDFTX 
      PROC DB$LNKS(BLOCK,SAVEPTR);
      BEGIN 
 #
* *   DB$LNKS - DELINK AND SAVE LINKED BLOCK     PAGE  1
* *   J E ESLER                                  DATE  4/11/78
* *   R L MCALLESTER                             DATE 02/06/79
* 
* DC  PURPOSE 
* 
*     THIS PROC DELINKS A BLOCK FROM A LINKED CHAIN OF BLOCKS.
*     THE SPECIFIED 
*     BLOCK IS ADDED TO A CHAIN OF IDLE BLOCKS.  THIS ALLOWS FREQUENTLY 
*     ALLOCATED BLOCKS TO BE REUSED AND RELEASED WITHOUT INCURRING CMM
*     OVERHEAD. 
* 
* DC  ENTRY CONDITIONS
* 
*     PARAMETERS
# 
      ITEM BLOCK;            #ADDRESS OF BLOCK TO BE DELINKED#
      ITEM SAVEPTR;          #POINTER TO SAVED BLOCK CHAIN# 
# 
* DC  EXIT CONDITIONS 
* 
*       BLOCK IS DELINKED AND PLACED ON SAVED BLOCK CHAIN.
*       BLOCK CONTAINS ADDRESS OF NEXT BLOCK IN ACTIVE CHAIN. 
* 
* DC  CALLED ROUTINES 
* 
# 
      XREF PROC DB$FLOP;     #GENERATE FLOW POINT#
# 
* 
* DC  NON-LOCAL VARIABLES 
# 
      XREF ARRAY DB$RA0;
        BEGIN 
        ITEM PRIOR(0,24,18); #PRIOR AND NEXT POINTERS MUST BE IN# 
        ITEM NEXT(0,42,18);  #THESE LOCATIONS OF THE FIRST WORD OF# 
                             #EACH BLOCK ENTRY TO BE DELINKED#
  
        ITEM NEXTIDL I(00,00,60);  # POINTER TO NEXT IDLE BLOCK        #
        END 
# 
* DC  DESCRIPTION 
* 
*     THE CMM BLOCK WHOSE ADDRESS IS SPECIFIED AS THE FIRST PARAMETER 
*     IS DELINKED FROM A CHAIN OF OTHER ACTIVE BLOCKS.
*     IT IS THEN LINKED INTO A CHAIN OF IDLE BLOCKS.
*     BLOCKS FROM THE IDLE CHAIN CAN BE REASSIGNED TO THE ACTIVE CHAIN
*     WITHOUT INCURRING THE CMM OVERHEAD. 
*     THE LIST OF IDLE BLOCKS IS MAINTAINED IN THE ORDER OF ASCENDING 
*     MEMORY ADDRESSES. 
*     THIS ASSURES THAT THE LOWEST ONES WILL BE ASSIGNED TO ACTIVE
*     STATUS, LEAVING THE ONES IN HIGHER MEMORY TO BE RELEASED WHEN 
*     MEMORY REDUCTION IS ATTEMPTED.
 #
# 
*     LOCAL VARIABLES.
# 
      ITEM SAVED;            # ADDRESS OF NEXT BLOCK IN ACTIVE CHAIN   #
      ITEM XX;               # INDUCTION VARIABLE                      #
  
  
  
#     B E G I N   D B $ L N K S   E X E C U T A B L E   C O D E .      #
  
  
      CONTROL IFGR DFFLOP,0;
        DB$FLOP("LNKS   ");            # GENERATE FLOW POINT - ENTRY   #
      CONTROL ENDIF;
  
#     DELINK THE BLOCK FROM THE ACTIVE CHAIN                           #
  
      SAVED = NEXT[BLOCK];
      NEXT[PRIOR[BLOCK]] = SAVED; 
      IF SAVED NQ 0 
      THEN
        BEGIN 
        PRIOR[SAVED] = PRIOR[BLOCK];
        END 
  
#     FIND THE INSERTION POINT FOR THIS IDLE BLOCK.                    #
  
      XX = LOC(SAVEPTR);
  
      FOR XX = XX 
        WHILE BLOCK GR NEXTIDL[XX]
        AND NEXTIDL[XX] NQ 0
      DO
        BEGIN 
        XX = NEXTIDL[XX]; 
        END 
  
#     INSERT THE BLOCK INTO THE CHAIN OF IDLE BLOCKS.                  #
  
      NEXTIDL[BLOCK] = NEXTIDL[XX]; 
      NEXTIDL[XX] = BLOCK;
  
      BLOCK = SAVED;
      RETURN; 
      END 
  
      TERM; 
