*DECK CSSTNS
USETEXT TEXTSS
USETEXT TEXTCS
USETEXT TXTSMCS
USETEXT TXTAPSS
PROC CSSTNS;
# TITLE CSSTNS - TERMINATE NPU SUPERVISION #
BEGIN # CSSTNS #
#
** CSSTNS - TERMINATE NPU SUPERVISION.
*
* C. BRION 82/04/13.
*
* THIS PROCEDURE PROCESSES SUPERVISION BROKEN SMS FROM NPUS.
* IF CURRENT OPERATOR ACTION IS ONGOING, THE OPERATOR (S) ARE
* CLEARED FROM THE NPUCB AND NOTIFIED OF THE NPUCB SITUATION.
* AN EVENT MESSAGE IS ISSUED THROUGH THE EVENT PROCESSOR QUEUE
* TO THE APPROPRIATE AUDIENCE GROUP.
*
* PROC CSSTNS
*
* ENTRY:
* WCARY = ONE WORD CONTAINING THE WORD COUNT OF THE ENTRY.
* ABHARY = APPLICATION BLOCK HEADER.
* TXTARA = BODY OF THE SUPERVISION BROKEN SM.
*
* EXIT:
* A NPU SUPERVISION LOST EVENT ISSUED IF NEEDED.
* AN OPERATOR MESSAGE INFORMING OF POSSIBLE DATA LOST IS
* ISSUED IF NEEDED VIA A TERMINAL TEXT QUEUE ENTRY.
* A ROUTED SOLICITED STATUS EVENT TO INDICATE STATUS DONE
* MAY BE ISSUED. (THIS CAUSES A READY.. MESSAGE TO THE
* OPERATOR.
#
#
**** PROC CSSTNS XREF LIST
#
XREF
BEGIN
PROC MESSAGE;
PROC SSTAQE;
PROC SSBCBW; # CLEAR BIT IN WORD #
PROC SSBSBF; # STORE BIT FIELD #
PROC SSBTBW; # TEST BIT IN WORD #
PROC SSCCTR; # CANCEL TIMER REQUEST #
END
#
****
#
#
* DEFS
#
DEF NULLSTATE$ # 99 #; # NULL STATE VALUE #
DEF LDAMSGL$ # 50 #; # LOST DATA MSG LENGTH #
#
* ITEMS
#
ITEM CNST1; # CONSTANT ---> 1 #
ITEM CNST2; # CONSTANT ---> 2 #
ITEM CNST3; # CONSTANT ---> 3 #
ITEM I; # LOOP VARIABLE #
ITEM OCBORD U; # OCB ORDINAL CELL #
ITEM PENDING B; # COMMAND PENDING FLAG #
ITEM SUCCESS B; # SET AFTER BY CANCEL TIMER #
ITEM TNAME C(10); # TERMINAL NAME OF CTRL NOP #
#
* ARRAYS
*
#
#
* FLG$WORD - BASED ARRAY THAT POINTS TO THE FLAG WORDS IN THE
* NPUCB.
#
BASED ARRAY FLG$WORD [00:00] S(NPCBSZ$);
BEGIN
ITEM FW$WORD I(00,00,60);
END
#
* LDAMSG - LOST DATA MESSAGE.
*
* MESSAGE ARRAY ISSUED WHEN A POSSIBLE LOSS OF A DATA MESSAGE
* MAY HAVE OCCURRED WHEN AN ONGOING ACTIVITY ON AN NPUCB IS
* TERMINATED.
#
ARRAY LDAMSG [00:00] S(5);
BEGIN
ITEM LDA$TXT1 C(00,00,05) = ["NPU: "];
ITEM LDA$NAME C(00,30,07);
ITEM LDA$TXT2 C(01,12,01) = [","];
ITEM LDA$NID C(01,18,03);
ITEM LDA$TXT3 C(01,36,27) = [",MESSAGE MAY HAVE BEEN LOST"];
ITEM LDA$ZERO U(04,18,42) = [0];
END
CONTROL EJECT;
#
* START MAIN PROCEDURE
#
#
* SEARCH FOR THE NPUCB WITH THE SAME NPU NODE NUMBER AND SAME
* HOST NODE NUMBER. INSURE SEARCH SUCCESS BY PRESETTING THE LAST
* NPUCB WITH THE SEARCH KEYS AND A NULL STATE.
#
NPU$NID[CSNPCNT] = ABHSN[0];
NPU$HID[CSNPCNT] = ABHDN[0];
NPU$STAT[CSNPCNT] = NULLSTATE$;
FOR I = 0 STEP 1 WHILE
NPU$NID[I] NQ ABHSN[0]
OR NPU$HID[I] NQ ABHDN[0]
DO
BEGIN
END
#
* IF NO NPUCB WAS FOUND, THEN IGNORE THIS SM.
#
IF NPU$STAT[I] EQ NULLSTATE$
THEN
BEGIN
RETURN; # **** RETURN **** #
END
ABHWORD[1] = 0; # CLEAR OUTGOING ABH WORD #
#
* A GOOD SUPERVISION BROKEN SM HAS BEEN RECEIVED SINCE A NPUCB WITH
* MATCHING NPU AND HOST NODE NUMBERS WAS FOUND.
* CHECK IF CURRENT SEND ACTION ONGOING, CLEAR THE ACTION AND THE
* SEND OPERATOR FROM THE NPUCB. INFORM THE SEND OPERATOR OF POSSIBLE
* MESSAGE LOSS VIA A TERMINAL TEXT ENTRY TO THE CONNECTION TRAFFIC
* QUEUE.
#
IF (NPU$OPSD[I] GR 0
AND NPU$OPSD[I] LQ MAXACN$)
THEN
BEGIN
FOR OCBORD=HOPORD$ STEP 1 UNTIL MAXACN$
DO
BEGIN
P<FLG$WORD> = LOC(NPU$SDFLGS[I]);
SSBTBW(FLG$WORD,OCBORD,PENDING);
IF PENDING
THEN
BEGIN
SSBCBW(FLG$WORD,OCBORD);
OC$CNPU[OCBORD] = 0; # CLEAR NPUCB FROM OCB #
OC$NCNT[OCBORD] = OC$NCNT[OCBORD] - 1; # NUM SEND NPUS #
#
* SEND MESSAGE TO SEND OPERATOR.
#
CNST1 = 0;
CNST2 = 30;
CNST3 = 42;
SSBSBF(LDAMSG,CNST1,CNST2,CNST3,B<00,42>NPU$NAME[I]);
LDA$NID[0] = NPU$DNID[I];
WCB$SMID[1] = SMID"TTEXT";
WCB$IAF[1] = TRUE; # SET INPUT ALLOWED FLAG #
#
* CHECK IF MULTIPLE SEND COMMAND IN PROGRESS PRIOR TO
* CLEARING THE OCB. IF MULTIPLE, SET INPUT ALLOWED FLAG TO
* NOT ALLOW NEXT COMMAND. IF SEND COMMAND FINISHED,
* CLEAR THE OCB VERB AND SET IAF TRUE.
#
IF OC$NCNT[OCBORD] NQ 0
THEN
WCB$IAF[1] = FALSE;
ELSE
OC$UVERB[OCBORD] = 0;
ABHTLC[1] = LDAMSGL$;
ABHADR[1] = OCBORD;
WCB$WC[1] = (LDAMSGL$/10) + 2;
SSTAQE(P<CNQ>,WCBUF[1],ABH[1],LDAMSG);
END
END
END
#
* CLEAR SEND OPERATOR FROM NPUCB.
#
NPU$OPSD[I] = 0;
#
* CHECK IF ONGOING STATUS ACTIVITY ON NPUCB. IF SO, CLEAR THE
* STATUS OPERATOR FROM THE NPUCB AND ISSUE A STATUS FINISHED
* EVENT TO THE EVENT PROCESSOR IF THIS CLEARED NPUCB HAS
* CAUSED THE NPU COUNT FOR THE STATUS OPERATOR TO REACH ZERO.
* IF THE STATUS ACTIVITY IS FINISHED, CLEAR THE ACTIVE VERB
* FOR THE OPERATOR.
#
IF (NPU$OPST[I] GR 0
AND NPU$OPST[I] LQ MAXACN$)
THEN
BEGIN
FOR OCBORD=HOPORD$ STEP 1 UNTIL MAXACN$
DO
BEGIN
P<FLG$WORD> = LOC(NPU$STFLGS[I]);
SSBTBW(FLG$WORD,OCBORD,PENDING);
IF PENDING
THEN
BEGIN
SSBCBW(FLG$WORD,OCBORD);
IF OC$CNPU[OCBORD] EQ I
THEN
OC$CNPU[OCBORD] = 0;
OC$NCNT[OCBORD] = OC$NCNT[OCBORD] - 1;
IF OC$NCNT[OCBORD] EQ 0
THEN
BEGIN
WCB$SMID[1] = SMID"STUFIN";
WCB$WC[1] = 2;
ABHADR[1] = OCBORD;
SSTAQE(P<EVQ>,WCBUF[1],ABH[1],CSSM[1]);
OC$VERB[OCBORD] = " ";
END
END
END
END # IF NPU$OPST #
NPU$OPST[I] = 0;
#
* IF THERE IS A CONTROLLING NOP FOR THIS NPU, THEN CLEAR THE
* CONTROLLING NOP FIELD AND SEND AN EVENT INDICATING CONTROL
* IS LOST.
#
IF NPU$CNOP[I] NQ 0
THEN
BEGIN
WCB$WORD[1] = 3;
WCB$SMID[1] = SMID"CTRLOFF";
ABHSN[1] = I;
TNAME = OC$TNAM[NPU$CNOP[I]];
SSTAQE(P<EVQ>,WCBUF[1],ABH[1],TNAME);
NPU$CNOP[I] = 0;
END
#
* CLEAR THE OVERLAY OPERATOR FOR THE NPUCB.
#
NPU$OVFLGS[I] = 0;
#
* IF REQUIRED GO IS OUTSTANDING, THEN CANCEL THE TIMER REQUEST AND
* CLEAR THE GO FLAG.
#
IF NPU$GFLAG[I]
THEN
BEGIN
SSCCTR(NPU$CNUM[I],SUCCESS);
NPU$GFLAG[I] = FALSE;
END
#
* PREPARE A SUPERVISION LOST EVENT AND SEND TO THE EVENT PROCESS
#
NPU$STAT[I] = SUPSTAT"SUPLOST"; # SET STATE OF NPUCB #
ABHWORD[1] = ABHWORD[0];
WCB$SMID[1] = SMID"SUPCB";
WCB$WC[1] = 2;
SSTAQE(P<EVQ>,WCBUF[1],ABH[1],CSSM[1]);
NPU$HID[I] = 0; # CLEAR HID OF NPUCB #
NPU$LRF[I] = FALSE; # CLEAR THE LOAD REQ FLAG #
NPU$DMPF[I] = FALSE; # CLEAR THE DUMP FLAG #
END # CSSTNS #
TERM