*DECK DB$RCBC 
USETEXT CDCSCTX 
      PROC DB$RCBC; 
      BEGIN 
 #
* *   DB$RCBC -- RCB CREATOR                     PAGE  1
* *   C O GIMBER                                 10/27/75 
* 
* DC  PURPOSE 
* 
*     THIS PRIMITIVE CREATES THE RCB (RUN-UNIT COMMAND BLOCK) 
* 
* DC  ENTRY CONDITIONS
* 
*     THE CURRENT TQT IS THE RCB OWNER-TO-BE. 
* 
* DC  EXIT CONDITIONS 
* 
*     AN RCB HAS BEEN LINKED INTO THE RCB CHAIN AND INITIALIZED 
*     TO RECEIVE A NEW REQUEST. 
* 
* DC  CALLING ROUTINES
* 
*     DB$CARS                AUTOMATIC RECOVERY SEQUENCER 
*     DB$CRMR                CRM RECALL ROUTINE 
*     DB$INIT                CDCS INITIALIZATION
*     DB$IREC                INPUT RECEIVER 
*     DB$ITC                 INTERNAL TASK CREATOR
*     DB$TRU                 TERMINATE RUN UNIT 
* 
* DC  CALLED ROUTINES 
# 
      XREF PROC DB$FLOP;     #GENERATE A FLOW POINT#
      XREF FUNC DB$LNKG;     #ASSIGN A RESERVED BLOCK#
# 
 #
  
  
  
#     B E G I N   D B $ R C B C   E X E C U T A B L E   C O D E .      #
  
  
 #
* 
* DC  DESCRIPTION 
* 
 #
  
      CONTROL IFGR DFFLOP,0;
        DB$FLOP("RCBC   ");        # GENERATE FLOW POINT - ENTRY       #
      CONTROL ENDIF;
  
 #
*     IF IDLERCBP IS NONZERO, IT POINTS TO AN IDLE RCB. 
*     DB$LNKG OBTAINS AN IDLE RCB IF ONE IS AVAILABLE.
*     WHEN THERE IS NO IDLE RCB, DB$LNKG OBTAINS AN RCB MEMORY BLOCK
*     FROM CMM. 
*     THE RCB THAT IS OBTAINED FROM EITHER SOURCE IS LINKED INTO
*     THE RCB CHAIN.
 #
      IF IDLERCBP NQ 0
      THEN
        BEGIN 
        RCBIC = RCBIC -1; 
        END 
  
      P<RCB> = DB$LNKG(P<RCB>,DFINRQBFSIZE+DFRCIR2,IDLERCBP); 
 #
* 
*     INITIALIZE THE KEY FIELDS OF THE RCB. 
*     SET STACK POINTER.
*     SET THE CONSTRAINING ADDRESS PERMANENTLY BUSY SO DB$SCHD WILL NOT 
*     SCHEDULE THIS RCB UNTIL DB$RCBQ HAS PROCESSED IT. 
*     ZERO TEMPORARY BUFFER CHAIN.
 #
      RCSTAKW[0] = LOC(RCB) + DFRCIR0;  # SET RCSTACKX, CLEARING THE   #
                                        # REST OF THE WORD.            #
      RCIR[0] = 0;
      RCCONSTRA[0] = LOC(STATBUSY);  # PERMANENTLY BUSY                #
      RCCT[0] = DFWAITINP;
      RCMBA[0] = 0; 
      RCFLAGWORD[0] = FALSE;       # CLEAR ALL RCB FLAGS               #
      RCTQT[0] = TQTMTR;
 #
*     SET INTERNAL TASK SAL INDEX TO ZERO.
 #
      RCITSALX[0] = 0;
 #
*     RCINOFCOMP IS AN ATTACH STATUS INDICATOR THAT IS USED BY DB$ADAX
*     AND DB$TQTT.
*     IT MUST BE CLEARED BEFORE THE NEXT REQUEST IS RECEIVED JUST IN
*     CASE THE NEXT REQUEST IS AN INVOKE OR VERSION CHANGE. 
*     IF EITHER OF THOSE REQUESTS WERE DROPPED WHILE RCINOFCOMP 
*     WAS UNDEFINED, A MALFUNCTION IN DB$TQTT COULD RESULT. 
* 
*     DB$INIT AND DB$QRF PLACE SHORTER RCB'S IN THE EMPTY CHAIN TO BE 
*     SET UP BY DB$RCBC.  RCINOFCOMP SHOULD NOT BE CLEARED FOR THESE
*     SHORTER RCB'S.  THEY ARE IDENTIFIED BY THE ABSENCE OF CRM CHAIN 
*     POINTERS AROUND THEM. 
 #
      IF RCNEXT[-1] EQ LOC(RCB) + DFINRQBFSIZE + DFRCIR2
        AND RCPRIOR[DFINRQBFSIZE + DFRCIR2] EQ LOC(RCB) -1
      THEN
        BEGIN 
        RCINOFCOMP[0] = 0;
        END 
  
      C<0,10>RCSTAKW[1] = "  * RCB * ";  # FOR QUICK IDENTIFICATION    #
      C<0,10>RCSTAKW[2] = "  * RCB * ";  # IN A DUMP                   #
      C<0,10>RCSTAKW[3] = "  * RCB * "; 
      C<0,10>RCSTAKW[4] = "  * RCB * "; 
      RETURN; 
      END 
      TERM; 
