CONSTINTEGER NEWCONNECT = 0; ! Set this non-zero to work with the ! new CONNECT mechanism. ENDOFLIST INCLUDE "ERCC16.SSOWNF" LIST ! %RECORDFORMAT SSOWNF(%INTEGER SSMONAD,DIAGMON) ! %EXTRINSICRECORD(SSOWNF) SSOWN RECORDFORMAT RF(INTEGER CONAD, FTYPE, DATASTART, DATAEND) RECORDFORMAT FRF(INTEGER CONAD, FILETYPE, DATASTART, DATEND, C SIZE, RUP, EEP, APF, USERS, ARCH, C STRING (6) TRAN, STRING (8) DATE, TIME, C INTEGER COUNT, SPARE1, SPARE2) RECORDFORMAT HDRF(INTEGER DATAEND,DATASTART,SIZE,TYPE,PASS1,DATETIME, C NEXTCYC,SEMA) SYSTEMROUTINESPEC DISCONNECT(STRING (31) FILE, INTEGERNAME FLAG) SYSTEMROUTINESPEC FINFO(STRING (31) FILE, INTEGER MODE, C RECORD (FRF)NAME FR, INTEGERNAME FLAG) SYSTEMROUTINESPEC WRLOG(STRING (255) ENTRY) SYSTEMSTRINGFNSPEC HTOS(INTEGER I,PL) SYSTEMSTRINGFNSPEC ITOS(INTEGER I) SYSTEMROUTINESPEC CONNECT(STRING (31) S, C INTEGER MODE, HOLE, PROT, RECORD (RF)NAME R, INTEGERNAME FLAG) ! %SYSTEMROUTINESPEC CHANGEACCESS(%STRING(31) FILE,%INTEGER MODE, %C ! %INTEGERNAME FLAG) SYSTEMROUTINESPEC SETUSE(STRING (31) FILE, INTEGER MODE,VALUE) SYSTEMROUTINESPEC MOVE(INTEGER LEN,FROM,TO) EXTERNALINTEGERFNSPEC DDELAY(INTEGER SECS) SYSTEMROUTINESPEC OUTFILE(STRING (31) S, INTEGER SIZE,MAXBYTES, C PROTECTION, INTEGERNAME CONAD,FLAG) SYSTEMSTRINGFNSPEC FAILUREMESSAGE(INTEGER FLAG) EXTERNALSTRINGFNSPEC UINFS(INTEGER I) EXTERNALINTEGERFNSPEC UINFI(INTEGER I) EXTERNALSTRINGFNSPEC DATE EXTERNALSTRINGFNSPEC TIME CONSTSTRING (4) LASTFN="}{|~"; ! This can be used instead of a file name ! as a parameter to CONNECT, etc., to mean "the last file I nominated". CONSTSTRING (7) SSMONFILE="SS#MON" CONSTINTEGER DEFMONSIZE=X'10000'; ! 64K CONSTINTEGER SSCHARFILETYPE=3 ! ! INTEGERFN STINT(STRING (15) S, INTEGERNAME INT) INTEGER I,J,K,L,SIGN LONGINTEGER RES CONSTINTEGER BIGGEST INT=X'7FFFFFFF' L=LENGTH(S) ->ERR IF L=0 RES=0 J=CHARNO(S,1) IF J='X' THEN START IF L>9 THEN -> ERR FOR I=2,1,L CYCLE J = CHARNO(S,I)-'0' IF J>9 THEN J=J+'0'-'A'+10 UNLESS 0<=J<=15 THEN -> ERR RES = (RES<<4)!J REPEAT FINISH ELSE START K=1 IF J='-' THEN SIGN=-1 AND K=2 ELSE SIGN=1 IF J='+' THEN K=2 FOR I=K,1,L CYCLE UNLESS '0'<=CHARNO(S,I)<='9' THEN -> ERR RES=RES*10+CHARNO(S,I)-48 ->ERR IF RES>BIGGEST INT REPEAT RES=RES*SIGN FINISH INT<-RES RESULT =0 ERR: RESULT =-1 END ; ! OF STINT ! ! EXTERNAL {SYSTEM}ROUTINE STARTMON(STRING (255) S) RECORD (FRF) FR RECORD (HDRF)NAME H RECORD (RF) RR INTEGER FLAG,CONAD,SSMONSIZE STRING (255) ENTRY ! See whether we know anything already IF SSOWN_SSMONAD=0 THEN START ! Not actively monitoring but the monitoring file may already exist. ! If it doesn't then set it up, otherwise connect in required mode ! Check SS#MON status. FINFO(SSMONFILE,0,FR,FLAG); ! Don't connect it even if it exists. IF 0#FLAG#218 THEN ->ERR IF FLAG#0 THEN START ! SS#MON doesnt exist - create it ! Has a size been requested? FLAG=STINT(S,SSMONSIZE) IF FLAG#0 THEN FLAG=140 {Invalid integer} AND ->ERR IF SSMONSIZE<DEFMONSIZE THEN SSMONSIZE=DEFMONSIZE OUTFILE(SSMONFILE,SSMONSIZE,SSMONSIZE,0,CONAD,FLAG) IF FLAG#0 THEN ->ERR H==RECORD(CONAD) H_DATAEND=SSMONSIZE H_TYPE=SSCHARFILETYPE H_PASS1=1 H_NEXTCYC=H_DATASTART H_SEMA=-1 PRINTSTRING(SSMONFILE." created OK ") FINISH CONNECT(SSMONFILE,11,0,8,RR,FLAG); ! Write shared/Perm connect/ ->ERR IF FLAG#0 SSOWN_SSMONAD=RR_CONAD FINISH ELSE PRINTSTRING("Already monitoring ") AND RETURN SSOWN_DIAGMON=0 ENTRY="DT: ".DATE." ".TIME." ".UINFS(1)." Procno=".ITOS(UINFI(11)). C " Invoc=".ITOS(UINFI(13)).": MONITOR ON " WRLOG(ENTRY) RETURN ERR: PRINTSTRING("STARTMON fails -".FAILUREMESSAGE(FLAG)) RETURN END ; ! OF STARTMON ! ! EXTERNALROUTINE ENDMON(STRING (255) S) STRING (255) ENTRY IF SSOWN_SSMONAD=0 THEN PRINTSTRING("Not currently monitoring ") AND RETURN SSOWN_DIAGMON=0 ENTRY="DT: ".DATE." ".TIME." ".UINFS(1)." Procno=".ITOS(UINFI(11)). C " Invoc=".ITOS(UINFI(13)).": MONITOR OFF " WRLOG(ENTRY) SSOWN_SSMONAD=0 RETURN END ; ! OF ENDMON ! EXTERNALROUTINE MONLEVEL(STRING (255) S) INTEGER FLAG,I IF SSOWN_SSMONAD=0 THEN PRINTSTRING("Not currently monitoring ") AND RETURN IF S="?" THEN PRINTSTRING("Current level: X".HTOS(SSOWN_DIAGMON,8)." ") AND RETURN FLAG=STINT(S,I) PRINTSTRING("Invalid integer ") AND RETURN IF FLAG#0 SSOWN_DIAGMON=I RETURN END ; ! OF MONLEVEL ! ! EXTERNAL {SYSTEM}ROUTINE SSLOG(STRING (255) S) RECORD (RF) RR RECORD (HDRF)NAME H,H1 INTEGER FLAG,ASEMA,SIZE,CONAD,L,MAXTRIES IF SSOWN_SSMONAD=0 THEN START CONNECT(SSMONFILE,11,0,0,RR,FLAG) ->ERR IF FLAG#0 IF NEWCONNECT#0 THEN SETUSE(LASTFN,-1,0) FINISH ELSE RR_CONAD=SSOWN_SSMONAD H==RECORD(RR_CONAD) ! Calculate size of T#MON. Depends whether it has wrapped round. IF H_PASS1=0 THEN SIZE=H_DATAEND ELSE SIZE=H_NEXTCYC OUTFILE("T#MON",SIZE,0,0,CONAD,FLAG) ->ERR IF FLAG#0 H1==RECORD(CONAD) H1_DATAEND=SIZE H1_TYPE=SSCHARFILETYPE MAXTRIES=3 ! Try to claim the semaphore ! Construct a descriptor to it ASEMA=RR_CONAD+28; ! Address of the semaphore. AGAIN: *LDTB_X'28000001'; ! Load descriptor type and bound *LDA_ASEMA; ! Load descriptor address *INCT_(DR ); ! Increment and test descriptor *JCC_7,<WAIT>; ! Jump to label WAIT on condition code 7 i.e. H_SEMA>0 ! Got the semaphore if here. IF H_PASS1#0 THEN MOVE(SIZE-32,RR_CONAD+32,CONAD+32) ELSE START L=SIZE-H_NEXTCYC MOVE(L,RR_CONAD+H_NEXTCYC,CONAD+32) MOVE(H_NEXTCYC-32,RR_CONAD+32,CONAD+32+L) FINISH ! Now release the semaphore *LDTB_X'28000001' *LDA_ASEMA *LSS_-1; ! Load ACC with -1 *ST_(DR ); ! Store it in H_SEMA DISCONNECT("T#MON",FLAG) PRINTSTRING("T#MON written ") RETURN WAIT: PRINTSTRING("**Can't claim semaphore ") AND RETURN IF MAXTRIES=0 FLAG=DDELAY(1) MAXTRIES=MAXTRIES-1 ->AGAIN ERR: PRINTSTRING("SSLOG fails - ".FAILUREMESSAGE(FLAG)) RETURN END ; ! OF SSLOG ENDOFFILE