*DECK DB$TRFW 
USETEXT CDCSCTX 
  
      PROC DB$TRFW((REC1),(LENGTH1),(REC2),(LENGTH2));
      BEGIN 
 #
* *   DB$TRFW -- TRANSACTION FILE WRITE          PAGE  1
* *   BOB MCALLESTER                             DATE  12/08/80 
* 
* DC  PURPOSE 
* 
*     WRITE THE JOURNAL LOG RECORD TO THE TRANSACTION FILE USING
*     THE 'REWRITER' FUNCTION.
*     IF THERE IS ALREADY A LOG RECORD OF THIS TRANSACTION ON THE FILE, 
*     THE NEW RECORD IS COMBINED WITH THE OLD AS A SINGLE DISK RECORD.
* 
* DC  ENTRY CONDITIONS
* 
* D   PARAMETERS
# 
      ITEM REC1    I;        # LOCATION OF JOURNAL LOG RECORD          #
      ITEM LENGTH1 I;        # LENGTH OF RECORD (EXCEPT RECORD IMAGE)  #
      ITEM REC2    I;        # LOCATION OF RECORD IMAGE                #
      ITEM LENGTH2 I;        # LENGTH OF RECORD IMAGE (MAY BE ZERO)    #
# 
* D   ASSUMPTIONS 
* 
*     SALX                   SCHEMA ACCESS LIST INDEX 
*     TQT                    TASK QUEUE TABLE POINTER 
* 
* DC  EXIT CONDITIONS 
* 
*     THE JOURNAL LOG RECORD IS WRITTEN TO THE TRANSACTION FILE (TRF).
* 
* DC  CALLING ROUTINES
* 
*     DB$JLO                 JOURNAL LOGGING OUTPUT FILE
* 
* DC  CALLED ROUTINES 
# 
      XREF PROC DB$FLOP;     # GENERATE A FLOW POINT                   #
      XREF PROC DB$IOER;     # I-O ERROR ON A LOG FILE                 #
      XREF PROC DB$PUNT;     # INTERNAL ERROR                          #
      XREF PROC DB$RWTR;     # REWRITE A RECORD                        #
      XREF PROC DB$RWTW;     # MOVE WORDS TO THE OUTPUT BUFFER         #
      XREF PROC DB$SCHD;     # DELAY EXECUTION OF THIS RCB             #
# 
* DC  NON-LOCAL VARIABLES MODIFIED
* 
*     FETLFNWD               LOGICAL FILE NAME WORD OF THE FET
*     FETCOMP                FET COMPLETION BIT 
* 
* DC  DESCRIPTION 
* 
*     DB$RWTW IS CALLED TO MOVE THE LOG RECORD INTO THE OUTPUT BUFFER 
*     THAT IS IN USE FOR THE TRANSACTION BEING PROCESSED. 
*     IF THERE IS A RECORD IMAGE, IT IS ALSO MOVED TO THE BUFFER. 
* 
*     IF THE BUFFER IS GREATER THAN 1000 OCTAL, THERE IS A CHANCE THAT
*     DB$RWTW MIGHT INITIATE A REWRITE.  THAT WOULD BE COUNTER
*     PRODUCTIVE SINCE THE LOG RECORD WILL FIT IN THE BUFFER AND A
*     REWRITER WILL BE ISSUED WHEN THE LOG RECORD IS IN THE BUFFER. 
* 
*     THE FET IS ARTIFICIALLY SET BUSY TO AVOID THE DB$RWTW REWRITE.
* 
*     THERE IS A SEPARATE FET AND I-O BUFFER FOR EACH ACTIVE SEGMENT
*     OF THE TRF. 
*     THAT PERMITS LOG RECORDS TO BE MOVED TO THE BUFFERS INEPENDENTLY. 
*     ONLY ONE DB$RWTR CALL MAY BE IN PROGRESS. 
*     SATRFPTR POINTS TO THE FET OF THE LAST DB$RWTR CALL.
*     THAT FET MUST BE COMPLETE BEFORE ANOTHER CALL CAN BE ISSUED.
 #
# 
*     LOCAL VARIABLES 
# 
  
*CALL ARTDCLS 
  
      BASED ARRAY FET;
*CALL FETDCLS 
      CONTROL EJECT;
  
  
#     S T A R T   O F   D B $ T R F W   E X E C U T A B L E   C O D E .#
  
      CONTROL IFGR DFFLOP,0;
        DB$FLOP("TRFW");
      CONTROL ENDIF;
  
      P<ART> = SAARTPTR[SALX];
      P<FET> = ARFETPTR[TQARTX[0]]; 
  
#     SET THE FET BUSY SO DB$RWTW WILL NOT ATTEMPT ANY I-O.            #
  
      FETCOMP[0] = FALSE; 
      DB$RWTW(P<FET>,REC1,LENGTH1);  # WRITE LOG RECORD                #
      IF LENGTH2 NQ 0 
      THEN
        BEGIN 
        DB$RWTW(P<FET>,REC2,LENGTH2);  # APPEND THE RECORD IMAGE       #
        END 
  
#     THERE IS ROOM IN THE BUFFER, SO THE RECORD WILL ALWAYS BE        #
#     TRANSFERRED TO THE BUFFER.  IF NOT, IT IS AN INTERNAL ERROR.     #
  
      IF LENGTH1 NQ 0 
        OR LENGTH2 NQ 0 
      THEN
        BEGIN 
        DB$PUNT("DB$TRFW"); 
        END 
  
      FETCOMP[0] = TRUE;     # SET THE FET COMPLETE AGAIN              #
  
      IF SATRFPTR[SALX] NQ LOC(FET) 
      THEN
        BEGIN 
                             # THE FET FOR THE CURRENT SEGMENT IS NOT  #
                             # THE LAST ONE USED.                      #
                             # IF THE LAST FET USED IS STILL BUSY,     #
                             # WAIT FOR IT TO COMPLETE.                #
        P<FET> = SATRFPTR[SALX];
        IF NOT FETCOMP[0] 
        THEN
          BEGIN 
          P<ART> = DFNPTR;
          P<FET> = DFNPTR;
                             # NO NEED TO PUSH/POP DB$TRFW BECAUSE IT  #
                             # IS ONLY CALLED FROM ONE PLACE.          #
  
                             # THE COMPLEMENT OF THE LOCATION INDICATES#
                             # AN INDIRECT ADDRESS POINTER.            #
          DB$SCHD(-LOC(SATRFPTR[SALX]),DFWAITLOG);
  
          CONTROL IFGR DFFLOP,0;
            DB$FLOP("TRFW-S1"); 
          CONTROL ENDIF;
  
                             # RESTORE POINTERS                        #
          P<ART> = SAARTPTR[SALX];
          P<FET> = SATRFPTR[SALX];
          END 
        IF FETNOSAT[0] NQ 0 
        THEN                 # I-O ERROR FROM A PRIOR FILE ACCESS      #
          BEGIN 
          DB$IOER(P<FET>);
          END 
        P<FET> = ARFETPTR[TQARTX[0]]; 
        SATRFPTR[SALX] = P<FET>;
        END 
  
      DB$RWTR(P<FET>);       # REWRITE RECORD                          #
      P<ART> = DFNPTR;
      P<FET> = DFNPTR;
      RETURN; 
  
      END 
      TERM
