*DECK DB$WART 
USETEXT CDCSCTX 
      PROC DB$WART; 
      BEGIN 
 #
* *   DB$WART - WRITE THE ART TO THE TRF         PAGE  1
* *   BOB MCALLESTER                             DATE  02/20/81 
* 
* DC  PURPOSE 
* 
*     WRITE THE AUTO RECOVERY TABLE TO A FIXED POSITION ON THE
*     TRANSACTION RECOVERY FILE.
* 
* DC  ENTRY CONDITIONS
* 
* D   ASSUMPTIONS 
* 
*     SALX                   SCHEMA ACCESS LIST INDEX 
*     SAL                    SCHEMA ACCESS LIST 
*       SAARTPTR             ART POINTER
*       SATRFPTR             POINTER TO LAST TRF FET USED 
* 
*     ART                    AUTO RECOVERY TABLE
*       ARMODFET             POINTS TO MODEL FET FOR THE TRF
*       ARNTUN               NUMBER OF CONCURRENT TRANSACTIONS ALLOWED
* 
* DC  EXIT CONDITIONS 
* 
*     NORMAL EXIT   - THE ART HAS BEEN RECORDED ON THE TRF. 
*                     THE RCB FLAG RCWART HAS BEEN SET TO FALSE 
*                     INDICATING THAT THE ART HAS BEEN WRITTEN TO THE 
*                     TRF, SO ANY LOCKS FOR THIS RUN UNIT CAN NOW BE
*                     RELEASED. 
* 
*     ABNORMAL EXIT - IF THE SCHEMA IS IN ERRDOWN STATUS, DB$WART 
*                     RETURNS WITHOUT DOING ANYTHING. 
*                     IF THERE IS AN I/O ERROR ON THE TRF, DB$IOER IS 
*                     CALLED TO SET THE SCHEMA STATUS TO ERRDOWN. 
*                     DB$IOER DOES NOT RETURN EXECPT WHEN THE CURRENT 
*                     TQT IS MONITOR"S. 
* 
* DC  CALLING ROUTINES
* 
*     DB$BEG$                BEGIN TRANSACTION
*     DB$CMT$                COMMIT TRANSACTION 
* 
* DC  CALLED ROUTINES 
# 
      XREF PROC DB$FLOP;     # RECORD A FLOW POINT                     #
      XREF PROC DB$IOER;     # I-O ERROR ON A LOG FILE                 #
      XREF PROC DB$IOWR;     # REWRITE A RECORD                        #
      XREF PROC DB$POP;      # RESTORE A WORD FROM THE RCB STACK       #
      XREF PROC DB$PUSH;     # SAVE A WORD IN THE RCB PUSH DOWN STACK  #
      XREF PROC DB$SCHD;     # TEMPORARY GIVE CONTROL TO OTHER TASKS   #
# 
* DC  NON-LOCAL VARIABLES MODIFIED
* 
*     SATRFPTR               POINTER TO THE LAST TRF FET USED 
* 
*     FET POINTERS           (BY DB$IOWR) 
*       FIRST, IN, OUT, LIMIT, RR 
* 
*     RCWART                 INDICATES IF ART MUST BE WRITTEN TO TRF
*                            BEFORE RELEASING LOCKS HELD BY THE RUN UNIT. 
* 
* DC  DESCRIPTION 
* 
*     IF THE SCHEMA IS IN *ERRDOWN* STATUS, RETURN. 
* 
*     WAIT UNTIL NONE OF THE FETS FOR THE TRF ARE BUSY. 
*     CHECK IF AN ERROR OCCURRED ON THE LAST TRF ACCESS.
*     CALL DB$IOWR TO WRITE THE ART TO THE TRF. 
*     CLEAR THE RCB FLAG RCWART TO INDICATE THAT THE ART HAS BEEN 
*     WRITTEN TO THE TRF. 
*     WAIT FOR THE WRITE TO COMPLETE. 
*     CHECK FOR AN ERROR ON THE WRITE.
 #
# 
*     LOCAL VARIABLES 
# 
*CALL ARTDCLS 
  
      BASED ARRAY FET;
*CALL FETDCLS 
  
      ITEM LENGTH I;         # LENGTH OF THE ART                       #
      CONTROL EJECT;
  
  
#     B E G I N   D B $ W A R T   E X E C U T A B L E   C O D E .      #
  
      CONTROL IFGR DFFLOP,0;
        DB$FLOP("WART");
      CONTROL ENDIF;
  
      IF SASCHST[SALX] EQ S"ERRDOWN"
      THEN
        BEGIN 
        RETURN; 
  
        END 
  
      DB$PUSH(DB$WART);      # SAVE RETURN ADDRESS                     #
      P<FET> = SATRFPTR[SALX];
      IF NOT FETCOMP[0] 
      THEN                   # WAIT FOR OTHER TRF ACTIVITY TO END      #
        BEGIN 
                             # USE AN INDIRECT CONSTRAINT ADDRESS      #
        DB$SCHD(-LOC(SATRFPTR[SALX]),DFWAITLOG);
  
        CONTROL IFGR DFFLOP,0;
          DB$FLOP("WART-S1"); 
        CONTROL ENDIF;
  
        P<FET> = SATRFPTR[SALX];
        END 
      IF FETNOSAT[0] NQ 0 
      THEN                   # ERROR ON A PRIOR FILE ACCESS            #
        BEGIN 
        DB$IOER(P<FET>);     # NO RETURN UNLESS MONITOR"S TQT          #
        DB$POP(DB$WART);
        RETURN; 
  
        END 
  
      P<ART> = SAARTPTR[SALX];
      P<FET> = ARMODFET[0];  # MODEL FET FOR THIS TRF                  #
      SATRFPTR[SALX] = LOC(FET);
      LENGTH = DFARTENSIZE * (ARNTUN[0] +1);
      FETRR[0] = 2; 
      DB$IOWR(P<FET>,P<ART>,LENGTH);
      RCWART[0] = FALSE;     # ART HAS BEEN WRITTEN TO THE TRF         #
      DB$SCHD(P<FET>,DFWAITIO); 
  
      CONTROL IFGR DFFLOP,0;
        DB$FLOP("WART-S2"); 
      CONTROL ENDIF;
  
      P<ART> = SAARTPTR[SALX];
      P<FET> = ARMODFET[0]; 
      IF FETNOSAT[0] NQ 0 
      THEN                   # ERROR ON THE WRITE                      #
        BEGIN 
        DB$IOER(P<FET>);
        END 
      DB$POP(DB$WART);
      RETURN; 
      END 
      TERM
