*DECK CHKNST
USETEXT COMCBEG 
USETEXT COMMCOM 
USETEXT COMRNET 
    PROC CHKNST;
#TITLE  CHKNST - CHECK NAD STATE #
      BEGIN  # CHKNST # 
  
# 
**    CHKNST - CHECK NAD STATE
* 
*     ENTRY      DLCHKNDT = FALSE (CHECK-NDT FLAG). 
*                DLRMTNAD = TRUE/FALSE (REMOTE/LOCAL NAD) 
*               <NAD$ENTRY> = FWA OF LOCAL NAD ENTRY
*               <NST$ENTRY> = FWA OF NAD STATUS ENTRY 
*               <PTH$ENTRY> = FWA OF PATH ENTRY 
*               <RMT$ENTRY> = FWA OF REMOTE NAD ENTRY 
* 
*     EXIT       DLCHKNDT = TRUE, IF NAD DUMP/LOAD NEEDED.
*                  NST$STATE = DUMP/LOAD IN PROGRESS
*                  DLDELAY = 0 (NETWAIT DELAY). 
*                ELGETLOG = TRUE, IF NAD ERROR LOG NEEDED.
*                  ELNADADR = <NAD$ENTRY> 
*                  ELPTHADR = <PTH$ENTRY> 
*                  ELRMTADR = <RMT$ENTRY> 
*                  ELRMTNAD = TRUE, IF REMOTE NAD ERROR LOG 
* 
*                (DLCHKNDT = ELGETLOG = FALSE)
*                  DLDELAY = NETWAIT DELAY (.LE. ELIDLEDLY).
* 
*     PROCESS    IF NAD AVAILABLE AND ERROR-LOG-ENABLED 
*                  IF TIME TO LOG NAD:  
*                    IF OLDEST CANDIDATE: 
*                      SAVE POINTERS. 
*                      SET ELGETLOG = TRUE. 
*                  ELSE:  
*                    SET DLDELAY = MIN (LOG-DELAY,DLDELAY)
*                ELSE:  
*                  IF NAD NEEDS DUMP/LOAD:  
*                    SET DUMP/LOAD IN PROGRESS
*                    IF NO DUMP-LOAD DELAY IN EFFECT: 
*                      SET DLCHKNDT = TRUE
*                      SET DLRETRY = DUMP/LOAD RETRY COUNT
*                    ELSE:  
*                      SET DLDELAY = MIN (DUMP/LOAD-DELAY,DLDELAY)
# 
  
# 
****  PROC CHKNST - XREF LIST BEGIN 
# 
      XREF
        BEGIN 
        PROC DBGNAME;              # DEBUG - DAYFILE MESSAGE #
        FUNC TIMDIF     I;         # TIME DIFFERENCE #
        END 
# 
****  PROC CHKNST - XREF LIST END 
# 
  
      ITEM ELAPSED    I;           # ELAPSED TIME # 
CONTROL EJECT;
  
      $BEGIN
      DBGNAME ("CHKNST");          # DEBUG MESSAGE #
      $END
  
      ELAPSED = TIMDIF (CURRTIM,NST$TIMCHK);  # ELAPSED TIME #
      IF NOT NAD$CWSBL             # IF LOCAL NAD AVAILABLE # 
        AND NST$STATE EQ NS$AVAIL  # AND NAD AVAILABLE #
        AND NST$LOG                # AND LOGGING ENABLED #
      THEN
        BEGIN 
        IF ELAPSED GE ELIDLEDLY    # IF TIME FOR NEXT LOG # 
        THEN
          BEGIN 
          IF ELAPSED GT ELDELAY    # IF OLDEST ENTRY SO FAR # 
            AND (ELAPSED GE ELACTIVDLY  # AND TIME TO LOG ACTIVE OR # 
                 OR (    DLRMTNAD AND (RMT$CCOUNT EQ 0))  # IDLE NAD #
                 OR (NOT DLRMTNAD AND (NAD$CCOUNT EQ 0))) 
          THEN
            BEGIN                  # SAVE LOG CANDIDATE # 
            ELRMTNAD = DLRMTNAD;
            ELNADADR = P<NAD$ENTRY>;
            ELPTHADR = P<PTH$ENTRY>;
            ELRMTADR = P<RMT$ENTRY>;
            ELGETLOG = TRUE;
            ELDELAY  = ELAPSED;    # SAVE LARGEST ELAPSED TIME #
            END 
  
          END 
  
        ELSE                       # NOT TIME FOR NEXT LOG #
          BEGIN 
          IF NOT ELGETLOG          # IF NO LOG CANDIDATE YET #
            AND  DLDELAY GT (ELIDLEDLY - ELAPSED)  # AND OLDEST # 
          THEN
            BEGIN 
            DLDELAY = ELIDLEDLY - ELAPSED;  # RESET DELAY TIME #
            END 
  
          END 
  
        END 
  
      ELSE
        BEGIN 
        IF (NST$STATE EQ NS$DMPREQ  # IF DUMP REQUESTED # 
            OR NST$STATE EQ NS$DMPCW)  # OR IN PROGRESS # 
          AND (   (NOT NST$AUTOD)        # AND    (NOT ALLOWED #
               OR (NST$DLRTY GE DLRTYLIM)     # OR RETRY LIMIT #
               OR (NST$DMPCTR GE DUMPLIMIT))  # OR DUMP LIMIT) #
          AND NST$AUTOL            # BUT AUTO LOAD ALLOWED #
        THEN
          BEGIN 
          NST$STATE = NS$LDREQ;    # RESET STATE = LOAD REQUIRED #
          END 
  
        IF (NST$STATE EQ NS$LDREQ  # IF LOAD REQUIRED # 
            AND NST$AUTOL)         # AND ALLOWED #
          OR (NST$STATE EQ NS$DMPREQ  # OR DUMP REQUIRED #
              AND NST$AUTOD)       # AND ALLOWED #
        THEN
          BEGIN 
          NST$STATE = NST$STATE - 1;  # IN-PROGRESS # 
          NST$DLDLY = 0;           # RESET DELAY #
          NST$DLRTY = 0;           # RESET RETRY COUNT #
          NST$ELENT = 0;           # CLEAR ERROR-LOG INFO # 
          END 
  
        IF (NST$STATE EQ NS$LDCW   # IF LOAD OR DUMP #
            OR NST$STATE EQ NS$DMPCW)   # IN-PROGRESS # 
        THEN
          BEGIN 
          IF ELAPSED GE NST$DLDLY  # IF NO DELAY #
          THEN
            BEGIN 
            DLCHKNDT = TRUE;       # DUMP/LOAD REQUEST FOUND #
            DLRETRY = NST$DLRTY;   # SET RETRY COUNT #
            DLSTATE = NST$STATE;   # STATE OF LOAD/DUMP # 
            DLTRACE = NST$TRACE;   # CONTROLWARE TRACE OPTION # 
            NST$TIMCHK = CURRTIM;  # RESET DELAY #
            END 
  
          ELSE  # DELAY IN EFFECT # 
            BEGIN 
            IF DLDELAY GT (NST$DLDLY - ELAPSED) 
            THEN
              BEGIN 
              DLDELAY = NST$DLDLY - ELAPSED;  # SAVE SMALLEST DELAY # 
              END 
  
            END 
  
          END 
  
        END 
  
      END  # CHKNST # 
  
    TERM
