*DECK DB$MBA
USETEXT CDCSCTX 
      PROC DB$MBA(SIZE,POINTER);
      BEGIN 
 #
* *   DB$MBA -- ALLOCATE MANAGED BUFFER.         PAGE  1
* *   C O GIMBER                                 03/30/76 
* 
* DC  PURPOSE 
* 
*     THIS ROUTINE ALLOCATES A BUFFER IN FIXED POSITION MEMORY. 
* 
*     THIS BUFFER IS LINKED TO THE RCB FOR WHICH IT IS CREATED. 
*     THERE IS ALSO A POINTER TO ITS BASED ARRAY POINTER. 
* 
*     IF THE REQUEST PROCESSING IS INTERRUPTED, THE BASED ARRAY POINTER 
*     IS AUTOMATICALLY RESTORED WHEN THE REQUEST IS RESCHEDULED.
*     THIS ELIMINATES THE NEED TO PUSH AND POP THE POINTER. 
* 
*     ALSO THIS BUFFER WILL BE RETURNED AUTOMATICALLY IF THE REQUEST
*     COMPLETED OR ABORTED FOR ANY REASON.
* 
*     EXAMPLE:  DB$MBA(13,P<SAM>) 
* 
* DC  ENTRY CONDITIONS
* 
*     PARAMETERS: 
# 
      ITEM SIZE;             #SIZE OF THE BUFFER TO ALLOCATE# 
      ITEM POINTER;          #P POINTER FOR BASED ARRAY#
# 
* DC  CALLED ROUTINES 
# 
      XREF PROC DB$FLOP;     #GENERATE A FLOW POINT#
      XREF FUNC DB$LNK;      #CREATE LINKED BLOCK#
      XREF PROC DB$LNKD;     #DELINK AND RETURN FIXED MEMORY BLOCK# 
      XREF PROC DB$PUNT;     #CDCS INTERNAL ERROR PROCESSOR#
# 
* DC  NON-LOCAL VARIABLES 
* 
*     CDCS COMMON 
# 
      XREF ARRAY DB$RA0;
        ITEM RA;
# 
 #
  
# 
*     LOCAL VARIABLES 
# 
      BASED ARRAY BUF;
        BEGIN 
        ITEM BASEPTR (0,0,18);         #ADDRESS OF BASE PTR FOR ARRAY#
        ITEM PRIOR (0,24,18);          #POINTER TO PRIOR MANAGED BUFFER#
        ITEM NEXT (0,42,18);           #POINTER TO NEXT MANAGED BUFFER# 
        END 
      ITEM INDEX; 
  
  
  
#     B E G I N   D B $ M B A   E X E C U T A B L E   C O D E .        #
  
  
 #
* DC  DESCRIPTION 
* 
*     CREATE BLOCK OF SIZE+1 LINKED TO RCB ENTRY. 
*     SET USER BASE POINTER.
 #
  
      CONTROL IFGR DFFLOP,0;
        DB$FLOP("MBA    ");            # GENERATE FLOW POINT - ENTRY   #
      CONTROL ENDIF;
  
      P<BUF> = DB$LNK(LOC(RCMBA[0]),SIZE+1);
      BASEPTR[0] = LOC(POINTER);
      POINTER = LOC(BUF)+1; 
      RETURN; 
  
  
#**********************************************************************#
#                                                                      #
#     E M B E D D E D   P R O C E D U R E   -   D B $ M B F .          #
#                                                                      #
#**********************************************************************#
  
      XDEF PROC DB$MBF; 
      PROC DB$MBF(POINTER); 
      BEGIN 
 #
* *   DB$MBF -- FREE MANAGED BUFFER              PAGE  1
* *   C O GIMBER                                 03/30/76 
* 
* DC  PURPOSE 
* 
*     THIS ROUTINE FREES A MANAGED BUFFER ASSOCIATED WITH JOB 
*        THRU THE RCB ENTRY.
*     EXAMPLE:  DB$MBF(P<SAM>)
* 
* DC  ENTRY CONDITIONS
* 
*     PARAMETERS
# 
      ITEM POINTER;          #BASE POINTER OF MANAGED BUFFER# 
# 
 #
  
      CONTROL IFGR DFFLOP,0;
        DB$FLOP("MBF    ");            # GENERATE FLOW POINT - ENTRY   #
      CONTROL ENDIF;
  
      P<BUF> = POINTER-1; 
      RA[BASEPTR[0]] = DFNPTR;
      DB$LNKD(P<BUF>);
      END 
  
  
#**********************************************************************#
#                                                                      #
#     E M B E D D E D   P R O C E D U R E   -   D B $ M B F A .        #
#                                                                      #
#**********************************************************************#
  
      XDEF PROC DB$MBFA;
      PROC DB$MBFA; 
      BEGIN 
 #
* *   DB$MBFA -- FREE ALL TEMPORARY BUFFERS       PAGE  1 
* *   C O GIMBER                                 4/2/76 
* 
* DC  PURPOSE 
* 
*     FREE ALL TEMPORARY BUFFERS WHICH WERE ALLOCATED BY DB$MBA.
* 
 #
  
      CONTROL IFGR DFFLOP,1;
        DB$FLOP("MBFA   ");            # GENERATE FLOW POINT - ENTRY   #
      CONTROL ENDIF;
  
      FOR INDEX=INDEX WHILE RCMBA[0] NQ 0 DO
        BEGIN 
        P<BUF> = RCMBA[0];
        RA[BASEPTR[0]] = DFNPTR;
        DB$LNKD(P<BUF>);
        END 
      END 
  
  
#**********************************************************************#
#                                                                      #
#     E M B E D D E D   P R O C E D U R E   -   D B $ M B S .          #
#                                                                      #
#**********************************************************************#
  
      XDEF PROC DB$MBS; 
      PROC DB$MBS;
      BEGIN 
 #
* *   DB$MBS -- SET POINTER FOR MANAGED BUFFERS  PAGE  1
* *   C O GIMBER                                 03/30/76 
* 
* DC  PURPOSE 
* 
*     THIS ROUTINE SETS ALL TEMPORARY BUFFER BASE POINTERS. 
* 
* DC  DESCRIPTION 
* 
*     FOLLOW THE CHAIN OF MANAGED BUFFERS FROM THE RCB. 
*     SET THE BASE POINTER FOR EACH BUFFER. 
 #
  
      CONTROL IFGR DFFLOP,1;
        DB$FLOP("MBS    ");            # GENERATE FLOW POINT - ENTRY   #
      CONTROL ENDIF;
  
      P<BUF> = LOC(RCMBA[0]); 
      FOR INDEX=INDEX WHILE NEXT[0] NQ 0 DO 
        BEGIN 
        P<BUF> = NEXT[0]; 
        RA[BASEPTR[0]] = LOC(BUF)+1;
        END 
      END 
      END 
      TERM; 
