*DECK NVFCUPS 
USETEXT TEXTNVF 
USETEXT TXSMNVF 
USETEXT TEXTSS
USETEXT TXTANVF 
USETEXT TXTAPSS 
USETEXT TXTSUSS 
PROC NVFCUPS; 
# TITLE - NVFCUPS - UPDATE PID STATUS # 
      BEGIN # NVFCUPS # 
  
# 
**    NVFCUPS - UPDATE PID STATUS.
* 
*     C. BRION    83/04/21,83/10/19.
* 
*     THIS PROCEDURE IS RESPONSIBLE FOR PROCESSING THE LOGICAL LINK 
*     STATUS SM FROM NIP. (CR/SLL/U SM ). 
* 
*     PROC NVFCUPS
* 
*     ENTRY 
*       CR/SLL/U SM IN MSGBUF.
* 
*     EXIT
*       1) SETPIDA FUNCTION REQUEST MAY BE SENT TO THE CPMRQ. 
*       2) A HOP/LG SM MAY BE ISSUED TO REPORT PID STATUS CHANGE IN NHP LOGFILE.
*       3) THE LLPID TABLE IS UPDATED.
# 
  
# 
****  PROC NVFCUPS XREF LIST. 
# 
      XREF
        BEGIN 
        PROC NVFUMQE;                    # MAKE QUEUE ENTRY # 
        END 
  
# 
****
# 
  
  
# 
*     DEF, ITEM AND ARRAY DEFINITIONS.
# 
      DEF ACTIVE$            # 1 #;      # ACTIVE LLINK STATUS #
      DEF INACTIVE$          # 0 #;      # INACTIVE LLINK STATUS #
  
      ITEM NUMLL             I;          # NUMBER OF LLINKS FOR A PID # 
      ITEM PORD              I;          # LOCAL PID ENTRY RWD #
      ITEM SAVACLL           I;          # SAVED NUMBER ACTIVE LLINKS # 
      ITEM LLORD             I;          # LOCAL PATH RWD # 
  
  
# 
**    PIDMSG - PID NHP LOG FILE MESSAGE ARRAY.
# 
      ARRAY PIDMSG [00:00] S(5);
        BEGIN 
        ITEM PUM$PFCSFC U(00,00,16) = [HOPLG];
        ITEM PUM$MSG1   C(01,00,05) = ["PID: "];
        ITEM PUM$PID    C(01,30,03);
        ITEM PUM$MSG2   C(01,48,02) = [", "]; 
        ITEM PUM$MSG3   C(02,00,10) = ["NHP PATH -"]; 
        ITEM PUM$MSG4   C(03,00,11) = ["UNAVAILABLE"];
        ITEM PUM$ZBYT   U(04,06,54) = [0];
        END 
# 
**    LLEPID - LOGICAL LINK ENTRY FROM PATHPID TABLE. 
# 
  
      BASED ARRAY LLEPID [00:00] S(1);
        BEGIN 
        ITEM LLE$WORD   U(00,00,60);     # WORD REFERENCE # 
        ITEM LLE$DN     U(00,00,08);     # DESTINATION NODE OF LLINK #
        ITEM LLE$SN     U(00,08,08);     # SOURCE NODE OF LLINK # 
        ITEM LLE$LLSTAT B(00,59,01);     # LLINK STATUS # 
        END 
  
  
      CONTROL EJECT;
  
# 
*     SEARCH THE LLPID TABLE FOR A MATCH ON LOGICAL LINK. 
*     NOTE THAT TABLE ONLY SEARCHED IF LLPID TABLE EXISTS.
# 
      IF LLPIDL NQ 0
      THEN
        BEGIN 
  
        FOR PORD = 0 STEP ((LLP$LLCNT[PORD] * PIDLLSIZ$) + 1) WHILE 
          PORD LS LLPIDL
        DO
          BEGIN 
          NUMLL = LLP$LLCNT[PORD] * PIDLLSIZ$;
          SAVACLL = LLP$ACLL[PORD]; 
          FOR LLORD = 1 STEP PIDLLSIZ$ UNTIL NUMLL
          DO
            BEGIN 
            P<LLEPID> = P<LLPID> + PORD + LLORD;
# 
*     CHECK IF LLINK ENTRY ACTIVE AND INCOMING STATUS INACTIVE. 
*     IF SO, MARK LLINK ENTRY INACTIVE AND DECREMENT NUMBER OF
*     LLINKS ACTIVE FOR THIS PID ENTRY. 
# 
            IF CRSLDN[0] EQ LLE$DN[0] AND 
               CRSLSN[0] EQ LLE$SN[0] 
            THEN
              BEGIN 
              IF LLE$LLSTAT[0] AND CRSLST[0] EQ INACTIVE$ 
              THEN
                BEGIN 
                LLE$LLSTAT[0] = FALSE;
                LLP$ACLL[PORD] = LLP$ACLL[PORD] - 1;
                END 
# 
*     OTHERWISE CHECK IF LLINK ENTRY IS INACTIVE AND INCOMING 
*     STATUS IS ACTIVE. 
*     IF SO, SET LLINK ENTRY ACTIVE AND INCREMENT NUMBER OF 
*     AVAILABLE LLINKS FOR THIS PID.
# 
              ELSE IF NOT LLE$LLSTAT[0] AND 
                          CRSLST[0] EQ ACTIVE$
              THEN
                BEGIN 
                LLE$LLSTAT[0] = TRUE; 
                LLP$ACLL[PORD] = LLP$ACLL[PORD] + 1;
                END 
              END 
            END 
# 
*     ISSUE SETPIDA FUNCTION REQUEST TO THE CPMRQ.
*     THIS DONE BY SETTING THE PARAMETER BLOCK AND MAKING 
*     QUEUE ENTRY FOR THE CPMRQ.
*     ALSO SET UP HOP/LG MESSAGE. 
# 
          P<LPIDBUF> = LOC(MSGBUF[1]);
          LPI$WORD0[0] = 0; 
          LPI$WORD1[0] = 0; 
          LPI$FC[0] = SPIDAFC$; 
          LPI$SIZE[0] = SPIDBUFS$;
          LPI$PID[0] = LLP$PNAME[PORD]; 
          PUM$PID[0] = LLP$PNAME[PORD]; 
# 
*     IF (NO LLINKS ACTIVE FOR PID PRIOR TO CURRENT STATUS SM AND 
*       /AT LEAST 1 LLINK NOW ACTIVE) OR
*        (AT LEAST 1 LLINK ACTIVE PRIOR TO CURRENT STATUS SM AND
*         NO LLINKS NOW ACTIVE) 
* 
*       ISSUE APPROPRIATE SETPIDA FUNCTION REQUEST TO CPMRQ 
# 
          IF ((SAVACLL EQ 0 AND LLP$ACLL[PORD] NQ 0) OR 
              (SAVACLL NQ 0 AND LLP$ACLL[PORD] EQ 0)) 
          THEN
            BEGIN 
            IF SAVACLL EQ 0 AND LLP$ACLL[PORD] NQ 0 
            THEN
              BEGIN 
# 
*     AT LEAST 1 LLINK NOW ACTIVE MAKING PID AVAILABLE. 
*     SET AVAILABLE STATUS IN FUNCTION REQUEST AND SET HOP/LG MSG.
# 
              LPI$NWST[0] = PIDOPST$; 
              PUM$MSG4[0] = "AVAILABLE";
              END 
            ELSE
              BEGIN 
# 
*     THE LAST ACTIVE LLINK FOR A PID HAS GONE INACTIVE MAKING
*     THE PID UNAVAILABLE.
*     SET UNAVAIALABLE STATUS IN FUNCTION REQUEST AND SET HOP/LG MSG. 
# 
              LPI$NWST[0] = PIDINOP$; 
              PUM$MSG4[0] = "UNAVAILABLE";
              END 
# 
*     GENERATE SETPIDA FUNCTION REQUEST Q ENTRY TO CPMRQ. 
*     SEND HOP/LG SM MESSAGE TO OTQ.
# 
            NVFUMQE(P<CPMRQ>,LPIDBUF[0],APPTTX$,0,LPIDLEN$);
            NVFUMQE(P<OTQ>,PIDMSG[0],APPCMD,0,5); 
            END 
          END 
        END 
      END # NVFCUPS # 
 TERM 
