*DECK DB$RWTR 
USETEXT CDCSCTX 
      PROC DB$RWTR((FETLOC)); 
      BEGIN 
 #
* *   DB$RWTR - REWRITE RECORD                   PAGE  1
* *   R L MCALLESTER                             DATE  10/21/80 
* 
* DC  PURPOSE 
* 
*     FORCE A REWRITER WITHOUT RECALL.
*     WAIT UNTIL THE WRITE IS COMPLETE AND THEN PUSH THE OUT POINTER
*     BACK TO THE LAST PRU BOUNDARY.
*     THIS WILL CAUSE THE NEXT REWRITE TO RESTORE THIS SAME DATA TO 
*     THE DISK ALONG WITH ADDITIONAL DATA THAT HAS BEEN ADDED.
* 
* DC  ENTRY CONDITIONS
* 
* D   PARAMETER 
# 
      ITEM FETLOC I;         # LOCATION OF THE FET                     #
# 
* D   ASSUMPTIONS 
* 
*     THE CURRENT WORD ADDRESS IS IN THE WORD IMMEDIATELY PRIOR TO
*     THE FET.
* 
* DC  EXIT CONDITIONS 
* 
*     A RECORD (SHORT PRU) HAS BEEN WRITTEN TO THE FILE.
*     THE FET OUT POINTER IS LEFT ON THE PRIOR PRU BOUNDARY.
* 
* DC  CALLING ROUTINES
* 
*     DB$JLCT                JOURNAL LOGGING OUTPUT CONTROLLER
*     DB$RCBF                RCB END-CONDITION FLAG PROCESSOR 
*     DB$TRFW                TRANSACTION FILE WRITER
* 
* DC  CALLED ROUTINES 
# 
      XREF PROC DB$FLOP;     # RECORD A FLOW POINT EXECUTION           #
      XREF PROC DB$IOER;     # I-O ERROR ON A LOG FILE                 #
      XREF PROC DB$POP;      # RESTORE A WORD FROM THE RCB STACK       #
      XREF PROC DB$PUSH;     # SAVE A WORD IN THE RCB STACK            #
      XREF PROC DB$RWTM;     # REWRITER MACRO                          #
      XREF PROC DB$SCHD;     # CDCS TASK SCHEDULER                     #
# 
* DC  NON-LOCAL VARIABLES MODIFIED
* 
# 
  
      BASED ARRAY FET;
*CALL FETDCLS 
# 
* DC  DESCRIPTION 
* 
*     CLEAR THE RWTR-IDLE-FLAG (FETWTRI).  THIS WILL PREVENT DB$JLCT
*     AND DB$TRFW FROM CALLING DB$RWTW OR DB$RWTR WHILE THE REWRITER
*     IS IN PROGRESS AND UNTIL THE OUT POINTER HAS BEEN SET BACK TO 
*     A PRU BOUNDARY. 
* 
*     CALL DB$RWTM TO ISSUE THE REWRITER MACRO. 
*     SAVE THE FET LOCATION AND CALL DB$SCHD TO WAIT FOR COMPLETION.
* 
*     AFTER COMPLETION OF THE REWRITER, USE THE SIX LOW ORDER BITS
*     OF THE CURRENT WORD ADDRESS FOR THE RELOCATION OF THE OUT POINTER 
*     BACK TO THE LAST PRU BOUNDARY.
* 
*     SET THE RTWR-IDLE-FLAG AGAIN SO THAT NORMAL LOGGING ACTIVITY
*     CAN CONTINUE. 
* 
*     WHEN RWTR-IDLE-FLAG IS CLEARED, THE RCB END-CASE FLAG, RCJLWTR, 
*     IS SET. 
*     THIS ASSURES THAT IF THE JOB IS TERMINATED WHILE WAITING FOR
*     THE REWRITER TO COMPLETE, CONTROL WILL BE RETURNED AND THE
*     RWTR-IDLE-FLAG WILL BE SET BEFORE DELETING THE RCB. 
* 
*     DB$IOER IS CALLED IF THERE IS AN I-O ERROR. 
 #
      CONTROL EJECT;
  
#     B E G I N   D B $ R W T R   E X E C U T A B L E   C O D E        #
  
      CONTROL IFGR DFFLOP,0;
        DB$FLOP("RWTR");
      CONTROL ENDIF;
  
      DB$PUSH(DB$RWTR); 
  
      P<FET> = FETLOC;
# 
*     IF RCJLWTR IS ALREADY SET, DB$RWTR HAS BEEN RECALLED BY DB$RCBF 
*     TO WAIT FOR REWRITER COMPLETION BEFORE TERMINATING THE RUN-UNIT.
# 
      IF NOT RCJLWTR[0] 
      THEN                   # IT IS AN ORIGINAL CALL                  #
        BEGIN 
        FETWTRI[0] = FALSE;  # CLEAR THE RWTR-IDLE-FLAG                #
        RCJLWTR[0] = TRUE;   # SET THE RCB END-CONDITION FLAG          #
        DB$RWTM(P<FET>);     # REWRITER MACRO                          #
        END 
  
      DB$PUSH(P<FET>);
      DB$SCHD(P<FET>,DFWAITIO);  # WAIT FOR THE REWRITER TO COMPLETE   #
  
      CONTROL IFGR DFFLOP,0;
        DB$FLOP("RWTR-S1"); 
      CONTROL ENDIF;
  
      DB$POP(P<FET>); 
      FETOUT[0] = FETOUT[0] - FETSR[0];  # MOVE BACK THE OUT POINTER   #
      IF FETOUT[0] LS FETFIRST[0] 
      THEN
        BEGIN                # MOVE OUT POINTER BACK INTO THE BUFFER   #
        FETOUT[0] = FETOUT[0] + FETLIMIT[0] - FETFIRST[0];
        END 
      FETRR[0] = FETSA[0];   # PUT PRIOR SECTOR ADDRESS IN RANDOM REQ  #
      FETWTRI[0] = TRUE;     # RESUME NORMAL LOGGING OUTPUT            #
      RCJLWTR[0] = FALSE;    # CLEAR THE END-CONDITION FLAG            #
      IF FETNOSAT[0] NQ 0 
      THEN                   # AN ERROR OCCURED ON THE REWRITE RECORD  #
        BEGIN 
        DB$IOER(P<FET>);
        END 
      DB$POP(DB$RWTR);
      END 
      TERM
