*DECK FFSTATE 
USETEXT TEXTFFS 
      PROC FFSTATE (TTYPE, DELAY);
*CALL COPYRITE
# TITLE FFSTATE - ADD TIMER ENTRY.                                     #
  
      BEGIN                            # FFSTATE                       #
# 
**    FFSTATE  ADD TIMER ENTRY. 
* 
*     A. LIM                           88/01/18 
* 
*     THIS PROCEDURE CREATES A TIMER ENTRY AND MAINTAINS THE LIST OF
*     TIMER ENTRIES IN ASCENDING EXPIRE TIME ORDER. 
* 
*     PROC FFSTATE (TTYPE, DELAY) 
* 
*     ENTRY    P<TMR> = PTR TO FILE SERVER TIMER LIST.
*              TTYPE  = TYPE OF TIMER ENTRY 
*                       *ROLLOUT*    - FILE SERVER ROLLOUT TIMER. 
*              DELAY  = TIME TILL EXPIRATION IN SECONDS.
*              CURLFN = CURRENT LOCAL FILE NAME.
* 
*     EXIT     TIMER ENTRY ADDED IN CORRECT POSITION. 
*              CTM$FTSEC = FIRE TIME OF FIRST TIMER ENTRY DUE.
* 
*     METHOD   CALCULATE EXPIRATION TIME FOR THE NEW TIMER ENTRY. 
* 
*              TIMER ENTRIES ARE ORDERED BY THEIR EXPIRATION TIMES. 
*              SEARCH THE TIMER ENTRIES TO DETERMINE THE POSITION 
*              FOR THE NEW ENTRY. CREATE AND INITIALIZE THE NEW 
*              ENTRY, SAVING THE TIMER TYPE AND EXPIRATION TIME.
* 
*              UPDATE THE FIRE TIME OF THE NEXT TIMER ENTRY DUE 
*              TO EXPIRE. 
* 
# 
  
# 
****  PROC FFSTATE - XREF LIST
# 
      XREF
        BEGIN 
        PROC FFSMATS;    # ALLOCATE TABLE SPACE                        #
        PROC FFSUCLR;    # UTILITY TO CLEAR AN AREA OF MEMORY          #
        PROC RTIME;      # GET REAL TIME CLOCK - SECONDS / MILLISECS   #
        END 
# 
****
# 
      ITEM TTYPE         S:TMRST;      # TYPE OF TIMER ENTRY           #
      ITEM DELAY         I;            # DELAY TIME IN SECONDS         #
      ITEM FTSEC         I;            # EXPIRATION TIME IN SECONDS    #
      ITEM I             I;            # LOOP INDUCTION VARIABLE       #
      ITEM TEMP          U;            # TEMPORARY RESULT OF RTIME     #
      CONTROL EJECT;
  
#     START MAIN PROCEDURE                                             #
  
      RTIME(TEMP);                     # RETRIEVE SYSTEM TIME          #
      CTM$RTIME[0] = TEMP;             # UPDATE CURRENT TIME           #
      FTSEC = CTM$RTSEC[0] + DELAY;    # CALCULATE EXPIRATION TIME     #
  
#     FIND CORRECT POSITION FOR THIS TIMER ENTRY                       #
  
      FOR I = 0 STEP 1                 # LOOP UNTIL END OF LIST OR     #
        WHILE (I*TMRSIZ$ LS TMRL) AND  # ENTRY POSITION FOUND          #
              (FTSEC GQ TMR$FTSEC[I]) 
      DO
        BEGIN 
        END;
  
#     MAKE ROOM FOR THE NEW ENTRY AND SET UP THE TIMER ENTRY FIELDS.   #
  
      FFSMATS (P<TMR>, I * TMRSIZ$, 
               TMRSIZ$);               # ALLOCATE SPACE FOR ENTRY      #
      FFSUCLR (LOC(TMR$WORD[I]),
               TMRSIZ$);               # CLEAR TIMER ENTRY             #
      TMR$FTSEC[I] = FTSEC;            # SET EXPIRATION TIME           #
      TMR$TYPE[I]  = TTYPE;            # SET TIMER TYPE                #
  
      CTM$FTSEC[0] = TMR$FTSEC[0];     # UPDATE TIMER FIRE TIME        #
  
      RETURN;                          # RETURN TO CALLER              #
  
      END                              # FFSTATE                       #
  
      TERM
