! ! ! BLOGY BLOGY BLOGY BLOGY BLOGY BLOGY BLOGY BLOGY BLOGY BLOGY BLOGY BLOGY ! BLOGY BLOGY BLOGY BLOGY BLOGY BLOGY BLOGY BLOGY BLOGY BLOGY BLOGY BLOGY ! ! ! %CONTROL K'001001' ! ! %BEGIN ! ! ! !G.J.B. // J.C.A. STARTED 10:11:76 ! ??? LAST UPDATE 14:3:79 10:30 - FILE BLOG6S ! FOR ERTE MK. 3.2 UPTO 128 USERS ! FOR CS1BM STANDARD COMMANDS ! LINES COMMENTED OUT WITH !@@ ARE CANDIDATES FOR CHANGE FOR F1 AND MK 3 ! --- STACK NORMAL --- ! ######################################################## ! # # ! # ANALYSIS OF E.R.T.E. RUN-LOGS # ! # # ! ######################################################## ! THIS VERSION IS SET UP FOR EMAS !ANALYSES LOG FILE PRODUCED DURING RUNS OF ERTE MK. 4.0 AND MK 3.2 !PROVIDES DISTRIBUTIONS OF RESPONSE AND THINK TIMES !AS HISTOGRAMS (USING EXT RT 'HIST') FOR DIFFERENT COMMANDS !USES W.S.C.'S PATENT DOUBLE ARITHMETIC PACKAGE ! ! INPUT: ! STREAM 0 COMMANDSTREAM ! STREAM 1 DATA LOG FROM STIMULATOR RUN ! ! OUTPUT: ! STREAM 1 RESULTS ! STREAM 2 NUMBERS FOR ALS TO CALCULATE ST DEV'S ! STREAM 3 DUMMY WRITING OF STAT_STATUS TO MAKE PROG WORK ????? ! ! ! ! !************************************************************************** ! ! ! %OWNSTRING(11) NN=' NORMALISED' %OWNSTRING(20) YAXIS='RESPONSE FREQUENCY' %OWNSTRING(60)%ARRAY RSPTITLE(0:1)='RESPONSE TIME (TILL PROMPT)', 'RESPONSE TIME (TILL FIRST REPLY)' ! ! %OWNSTRING(64) HEAD="E.R.T.E. LOG ANALYSIS BY COMMAND - VERS 7.1 B.G." %OWNSTRING(32) HEAD1=" " !@@ %OWNSTRING(32) HEAD1=" F1 STANDARD COMMANDS" %OWNSTRING(16) CHAR PROMPT="CHARS PER UNIT: " %OWNSTRING(20) NORM PROMPT="UNITS PER 1/10 SEC: " %OWNSTRING(11) PROMPT0="ERTE VRSN: " %OWNSTRING(6) PROMPT1='MODE :' %OWNSTRING(26) %ARRAY TITLOUT(0:2)=%C "RESPONSE TIME (1/10 SECS)", "REACTION TIME (1/10 SECS)", "% REACTIONS < 2 SECS "; ! ! !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ! ! %CONSTINTEGER GREATEST=32767; !LARGEST POSSIBLE NUMBER(16 BITS) %CONSTINTEGER PERSEC=10; !TICKS PER SECOND %CONSTINTEGER DISTMAX=51; !MAX VALUE OF RESPONSE RANGE %CONSTINTEGER RECTYPMAX=3; !TYPES OF INPUT RECORD %CONSTINTEGER NORM FACTOR=200; !MAX VALUE OF NORMALISED GRAPH ! %CONSTINTEGER SP=0 %INTEGER GAP,ST %CONSTINTEGER START=0 %CONSTINTEGER QUANTUM=1000; !FOR DOUBLE WORD ARITHMETIC ! %CONSTINTEGER MULTIPLY=2 %CONSTINTEGER DIVIDE=3 ! %CONSTINTEGER FIXSKIP=480; !8 MINUTES IN SEC TICKS %CONSTINTEGER FIXTIME=1800; !30 MINUTES IN SEC TICKS %CONSTINTEGER FIXRECS=-1 %CONSTINTEGER SATISLEVEL=20; !2 SECS ! %CONSTINTEGER NULL=0 %CONSTINTEGER SYSWAIT=1 ;!PROCESS WAITING ON SYSTEM REPLY %CONSTINTEGER USERWAIT=2 ;!PROCESS WAITING ON USER INPUT %CONSTINTEGER RECDATA=3 ! %CONSTINTEGER NOT STARTED=-2 ;!PROCESS NOT RUNNING %CONSTINTEGER WAITING=-1 ;!PROCESS WAITING FOR COMMAND %CONSTINTEGER BORING=0 ! %CONSTINTEGER PROCS=128 ! %CONSTINTEGER EOF=4 %CONSTBYTEINTEGER END CHAR='+' %CONSTBYTEINTEGER START SYMB='*' %CONSTINTEGER MTEXTL=200 %CONSTINTEGER MCOMMS=5 ;!MAXIMUM COMMANDS FOR ANALYSI ! ! !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ! ! ! %OWNBYTEINTEGERARRAY XAXIS(1:20)='R','E','S','P','O','N','S','E', ' ','1','/','1','0',' ','S','E','C','S',' '(2); ! ! %INTEGERARRAY DISTRSP(0:623) ;!2*(MCOMMS+1)*(DISTMAX+1) ENTRIES %OWNINTEGERARRAY SATIS(-2:7); !(-2:MCOMMS+2) %OWNINTEGERARRAY TEXT(0:MTEXTL) ! %OWNINTEGER INITIALISED='N' ! ! !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ! ! %INTEGER THOU,UNIT %INTEGER HOLDTIME %INTEGER H,MODE,ZZ %INTEGER TIME,DIRECTION,TT,LENGTH,XLENGTH,SYM %INTEGER MAX TIME,MAX RECORDS,F,G,CHAR,GRAPHS %INTEGER LAST TIME %OWNINTEGER CHARTIME=0 %OWNINTEGER NORMTIME=1 %OWNINTEGER NUMBSTREAM=2 %INTEGER ZERO TIME %INTEGER SKIPTIME %STRING(64) TITLE ! ! !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ! ! %RECORDFORMAT STATE(%INTEGER TIME1,STATUS,STATUS1,FLAG) ! ! %RECORD(STATE) %ARRAY PLIST(0:PROCS) ! ! %RECORD(STATE) %NAME STAT %OWNINTEGERARRAY CHARSIN(0:PROCS) ! ! !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ! ! %EXTERNALROUTINESPEC HIST(%INTEGERARRAYNAME HST,%C %INTEGER LEN,START,ST,GAP,SP,%C %STRINGNAME TITLE,YAXIS,%BYTEINTEGERARRAYNAME XAXIS) ! %EXTERNALROUTINESPEC PRINTD(%INTEGER N1,N2,SP,DEC) ! %EXTERNALROUTINESPEC AVAR(%INTEGERARRAYNAME NUM,%C %INTEGER N,START,OP,VAL,GAP) ! %EXTERNALROUTINESPEC SQRT(%INTEGERNAME N1,N2) %EXTERNALROUTINESPEC ARITH(%INTEGERNAME N1,N2,%INTEGER BY1,BY2,OP) ! ! ! ! !***************************************************************************** !************************************************************************** ! ! %ROUTINE CHECK OVER(%INTEGERNAME THOU,UNITS) ! !CHECKS UNITS HAVE NOT OVERFLOWED INTO THE THOU PARTITION !IF DECREMENTS UNITS AND INCREMENTS THOU'S ACCORDINGLY ! ! %WHILE UNITS>=QUANTUM %THEN UNITS=UNITS-QUANTUM %AND THOU=THOU+1 ! %END ;!RT CHECK OVER ! ! !*************************************************************************** ! ! %ROUTINE NORM(%INTEGERARRAYNAME AA,%INTEGER LOW,HIGH) ! !NORMALISES THE VALUES IN AA TO RANGE 0 -> NORMFACTOR ! ! %INTEGER F,TAL,THDUM,DUM ! ! THDUM=0 TAL=0 %CYCLE F=LOW,1,HIGH TAL=TAL+AA(F) %REPEAT ! %IF TAL=0 %THEN %RETURN ! %CYCLE F=LOW,1,HIGH DUM=AA(F) CHECK OVER(THDUM,DUM) ARITH(THDUM,DUM,0,NORMFACTOR,MULTIPLY) ARITH(THDUM,DUM,0,TAL,DIVIDE) AA(F)=DUM+QUANTUM*THDUM %REPEAT ! %END ;!RT NORMALISE ! ! !**************************************************************************** ! ! ! ! %OWNINTEGERARRAY S1(0:11) ;! LENGTH 2*MCOMMS %OWNINTEGERARRAY S2(0:11) %OWNINTEGERARRAY TN(0:11) ! %CONSTINTEGERARRAY COMMAND(1:10)=13,10,'C','O','M','M','A','N','D',':' !@@ %CONSTINTEGERARRAY COMMAND(1:2)='$',' '; !VAX-VMS PROMPT ! ! DEFAULT COMMAND SET ! %OWNINTEGER COMMS=5 !@@ %OWNINTEGERARRAY CLEN(0:5)=5,3,5,4,3,4 !@@ %OWNINTEGERARRAY CS(0:39)='I','M','P',0(5),'F','O','R','T','E',0(3), !@@ 'E','D','I','T',0(4),'R','U','N',0(5),'L','I','S','T',0(4) %OWNINTEGERARRAY CLEN(0:5)=5,3,5,4,3,1 %OWNINTEGERARRAY CS(0:39)='I','M','P',0(5),'F','I','L','E','S',0(3), 'C','O','P','Y',0(4),'R','U','N',0(5),'E',0(7) ! %INTEGERMAP COMMANDS(%INTEGER NUMBER,CHAR) %RESULT==CS(8*(NUMBER-1)+CHAR-1) %END ! %OWNINTEGERARRAY CSC(0:11)=5,40,40,4,5,0,2,40,40,2,3,0 ! %INTEGERMAP CSCALE(%INTEGER DIST,STATUS1) %RESULT==CSC(DIST*(MCOMMS+1)+STATUS1) %END ! ! !MATCH ATTEMPS TO MATCH LEN CHARACTERS FROM STANDARD, STARTING AT !BASE, WITH THE FIRST CHARACTERS IN TEXT ! ! %PREDICATE MATCH(%INTEGERARRAYNAME STANDARD,%INTEGER BASE,LEN) %INTEGER F %FALSE %IF LENGTH='a' %THEN %START %IF TEXT(F)<='z' %THEN %START TEXT(F)=TEXT(F)-'a'+'A' %FINISH %FINISH %FALSE %IF TEXT(F)#STANDARD(F+BASE-1) %REPEAT %TRUE %END ! ! ! ! %ROUTINE BUMP(%INTEGER DIST,STATUS1) %INTEGER I %INTEGERNAME DD ! DROP NUMBERS FOR ALS SELECT OUTPUT(NUMBSTREAM); WRITE(DIST,6); WRITE(STATUS1,6); WRITE(HOLDTIME,6); NEWLINE SELECT OUTPUT(1) I=6*DIST+STATUS1 S2(I)=S2(I)+HOLDTIME CHECK OVER(S1(I),S2(I)) TN(I)=TN(I)+1 %RETURN %UNLESS GRAPHS>0 DUM1:HOLDTIME=HOLDTIME//CSCALE(DIST,STATUS1) %IF HOLDTIME>DISTMAX %THEN HOLDTIME=DISTMAX DD==DISTRSP((STATUS1+DIST*(MCOMMS+1))*(DISTMAX+1)+HOLDTIME) DD=DD+1 %END ! ! !%EXTERNALROUTINESPEC READX(%INTEGERNAME X) ! %ROUTINE ADJUST(%INTEGERNAME TIME,CHARSIN) ! FOR ERTE MK. 4 REMOVES CHARSINPUT TIME DUMX: TIME=TIME-(CHARSIN*CHARTIME)//NORMTIME %IF TIME<0 %THEN TIME=0 %END ;!RT ADJUST %ROUTINE REINITIALISE ! !CLEARS ALL ARRAYS OUT TO ZERO !CLEARS STATUS VECTORS FOR ALL VIRTUAL CONSOLES OUT TO ZERO ! ! %INTEGER F,G ! ! %CYCLE G=0,1,11 TN(G)=0 S1(G)=0 S2(G)=0 %REPEAT %CYCLE G=0,1,MCOMMS SATIS(G)=0 %REPEAT %CYCLE F=0,1,MTEXTL TEXT(F)=0 %REPEAT ! ! %CYCLE G=0,1,623 DISTRSP(G)=0 %REPEAT ! ! ! %CYCLE F=0,1,PROCS PLIST(F)=0 PLIST(F)_STATUS=NULL PLIST(F)_STATUS1 = WAITING; ! MK.6 ONLY %REPEAT INITIALISED='Y' NUMBSTREAM=2 ! %END ! !*************************************************************************** ! ! ! SKIP TIME=GREATEST TIME=0; LAST TIME=0 %CYCLE F=0,1,PROCS CHARSIN(F)=0 %REPEAT ! REINITIALISE ! ! !TELL WHO WE ARE ! ! PRINTSTRING(HEAD) PRINTSTRING(HEAD1) NEWLINE ! ! FIND OUT WHICH ERTE WAS USED ! PRINTSTRING(PROMPT0) NEWLINE READ(F) %IF F=4 %THEN %START ! ERTE MK 4 MUST ADJUST FOR TYPE IN TIME PROMPT(CHAR PROMPT) READ(CHARTIME) PROMPT(NORM PROMPT) READ(NORMTIME) %IF NORMTIME<=0 %THEN PRINTSTRING("???") %AND NEWLINE %AND %STOP %FINISH ! !FIND OUT WHICH MODE ! PRINTSTRING(PROMPT1) NEWLINE READ(MODE) ! PROMPT('GRAPHS:'); READ(GRAPHS) ! !GET PARAMETERS FOR THIS RUN ! ! %IF MODE=3 %OR MODE=4 %THEN %START ! !FIXED FORMAT - NO LOG EXPANSION,FIXED TIME,FIXED NUMBER OF RECORDS ! MAX RECORDS=-1 MAX TIME=FIX TIME*PERSEC SKIP TIME=FIXSKIP*PERSEC; !TIME TO BE SKIPPED BEFORE GETTING DATA NUMBSTREAM=3 INITIALISED='N' MODE=MODE-2 ! %FINISH %ELSE %START ! ! !ANY PARAMETER SET TO -1 MEANS MAXIMUM AVAILABLE TO BE GIVEN ! ! PRINTSTRING('MAX RECORDS: ') NEWLINE READ(MAXRECORDS) %IF MAXRECORDS=0 %THEN %STOP ! PRINTSTRING('MAX TIME (IN SECONDS): ') NEWLINE READ(MAXTIME) %IF MAX TIME<=0 %THEN MAX TIME=GREATEST %IF (GREATEST//PERSEC)0 %START PRINT STRING('SCALE FOR TIME TO PROMPT: ') NEWLINE READ(CSCALE(0,F)) %FOR F=1,1,COMMS PRINT STRING('SCALE FOR TIME TO REPLY: ') NEWLINE READ(CSCALE(1,F)) %FOR F=1,1,COMMS %FINISH %FINISH ! !GET TITLE FOR THIS LOG FROM USER ! ! PRINTSTRING('TITLE: ') NEWLINE ! %WHILE NEXT SYMBOL#NL %THEN SKIP SYMBOL SKIP SYMBOL ! ! SELECT OUTPUT(1) PRINT SYMBOL(12) SELECT OUTPUT(2) PRINT SYMBOL(12) SELECT OUTPUT(1) ! ! %CYCLE READ SYMBOL(F) PRINT SYMBOL(F) SELECT OUTPUT(2) PRINT SYMBOL(F) SELECT OUTPUT(1) %EXIT %IF F=NL %REPEAT ! ! SELECT INPUT(1) ! ! !***************************************************************************** ! ! !FIND AND SKIP TITLE LINE IN DATA LOG ! ! SKIP SYMBOL %WHILE NEXT SYMBOL#START SYMB %CYCLE SELECT OUTPUT(0) READ SYMBOL(F) PRINT SYMBOL(F) SELECT OUTPUT(1) PRINT SYMBOL(F) ! %IF F=NL %THEN %EXIT %REPEAT ! ! ! ! !************************************************************************** ! ! !MAIN LOOP !READ IN AND ANALYSE EACH LINE OF THE LOG ! ! H=0 %CYCLE ! ! %IF MAXRECORDS#-1 %THEN %START %IF MAXRECORDS>=H %THEN %EXIT %FINISH H=H+1 %EXIT %IF NEXT SYMBOL<0 %OR NEXT SYMBOL=EOF ! ! !READ LINE IN ! READ(TIME) !######## %IF TIME=0 %THEN TIME=LAST TIME; !SOME BAD TIMES IN TCPX91 LAST TIME=TIME !######## ! ! %IF H=1 %THEN %START ! !RECORD TIME OF FIRST TRANSACTION ! ZERO TIME=TIME %IF GREATEST-ZEROTIME>MAXTIME %THEN MAXTIME=MAXTIME+ZEROTIME %C %ELSE MAX TIME=GREATEST %FINISH ! ! %IF TIME>MAX TIME %THEN %EXIT ! %IF INITIALISED='N' %THEN %START %IF TIME>SKIPTIME %THEN %START ! !HAVE JUST GONE OVER 'SKIPTIME'S' WORTH OF FILE THROW EVERYTHING !GATHERED SO FAR AWAY (IS ALL WARM UP DATA) ! REINITIALISE SKIPTIME=GREATEST ZERO TIME=TIME MAX TIME=FIXTIME*PERSEC %IF GREATEST-ZEROTIME>MAXTIME %THEN MAXTIME=MAXTIME+ZERO TIME %C %ELSE MAX TIME=GREATEST ! %FINISH %FINISH ! ! READ(DIRECTION) ! ! ! READ(TT) READ(LENGTH) %IF LENGTH>0 %START ! !READ IN TEXT OF MESSAGE PASSED ! SKIP SYMBOL; !ALWAYS A SPACE AT START SKIP SYMBOL ! ! XLENGTH = LENGTH %IF XLENGTH > 90 %THEN XLENGTH = 90 %CYCLE F=1,1,XLENGTH READ SYMBOL(TEXT(F)) %REPEAT %FINISH ! ! ! !IGNORE ANY ERRONEOUS DATA. ALIST WILL GIVE FURTHER DETAILS ! %CONTINUE %IF TT<0 %OR TT>PROCS %OR DIRECTION<1 %OR DIRECTION>RECTYPMAX ! ! ! !&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ! !ANALYSE AND STORE DATA ! !&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ! !GET PROCESS LIST ENTRY FOR THIS CONSOLE ! ! STAT==PLIST(TT) ! ! ! ! %IF DIRECTION=1 %THEN %START ! ! !MESSAGE GOING TO EMAS ! CHARSIN(TT)=LENGTH %IF STAT_STATUS1=WAITING %THEN %START ! !WAITING FOR A COMMAND - SEE IF IT IS INTERESTING ! STAT_STATUS1=BORING %CYCLE F=1,1,COMMS %IF MATCH(CS,8*(F-1),CLEN(F)) %THEN STAT_STATUS1=F %AND %EXIT %REPEAT %FINISH ! STAT_TIME1=TIME STAT_STATUS=SYSWAIT %FINISH ! ! %IF DIRECTION=2 %THEN %START ! !MESSAGE ON WAY BACK TO CONSOLE - HAS REACHED TCP ! !THE FOLLOWING LINE IS RATHER ODD BUT NECESSARY TO MAKE PROG WORK ???? SELECT OUTPUT(3); WRITE(STAT_STATUS,0); NEWLINE; SELECT OUTPUT(1) %IF STAT_STATUS=SYSWAIT %AND STAT_STATUS1#NOT STARTED %START ! !MEASURE REACTION TIME FOR REPLY ! HOLDTIME=TIME-STAT_TIME1 ADJUST(HOLDTIME,CHARSIN(TT)) F=STAT_STATUS1 SATIS(F)=SATIS(F)+1 %IF HOLDTIME XXY ! ! %REPEAT ! ! !*************************************************************************** ! ! ! !PRINT RESULTS ! ! !PRINT HISTOGRAMS OF RESPONSE TIMES FOR ALL MONITORED COMMANDS, AND THE OTHERS ! ! %CYCLE F=0,1,COMMS %CYCLE G=0,1,1 ! !CALCULATE START POSITION OF DISTRIBUTION IN D. RATHER MESSY, BUT !DISTRIBUTION MUST BE IN A 1-D ARRAY FOR HIST ! %IF GRAPHS>0 %START ST=(G*(MCOMMS+1)+F)*(DISTMAX+1) GAP=CSCALE(G,F) TITLE=RSPTITLE(G) HIST(DISTRSP,DISTMAX+1,ST,START,GAP,SP,TITLE,YAXIS,XAXIS) %FINISH NEWLINE %IF F=0 %THEN PRINT STRING('OTHER') %ELSE %START PRINT SYMBOL(COMMANDS(F,H)) %FOR H=1,1,CLEN(F) %FINISH PRINT STRING(' COMMANDS : ') H=F+6*G SPACES(13-CLEN(F)) WRITE(TN(H),9) NEWLINE ARITH(S1(H),S2(H),0,TN(H),DIVIDE) %UNLESS TN(H)=0 PRINT STRING(TITLOUT(G)); PRINTD(S1(H),S2(H),10,0) NEWLINE %CONTINUE %UNLESS GRAPHS>0 NORM(DISTRSP,ST,ST+DISTMAX) TITLE=TITLE.' NORMALISED' HIST(DISTRSP,DISTMAX,ST,START,GAP,SP,TITLE,YAXIS,XAXIS) NEWLINE PRINT STRING('NORMALISED RANGE 0 -') WRITE(NORM FACTOR,0) NEWLINES(2) %REPEAT %REPEAT ! DROP SATISFACTION LEVELS NEWLINES(4) %CYCLE F=0,1,COMMS %IF F=0 %THEN PRINTSTRING("OTHER") %ELSE %START PRINT SYMBOL(COMMANDS(F,H)) %FOR H=1,1,CLEN(F) %FINISH PRINT STRING(" COMMANDS") NEWLINE PRINT STRING(TITLOUT(2)) THOU=0 UNIT=SATIS(F) H=F+6 CHECK OVER(THOU,UNIT) ARITH(THOU,UNIT,0,100,MULTIPLY) %IF TN(H)#0 %THEN ARITH(THOU,UNIT,0,TN(H),DIVIDE) %ELSE %START THOU=0 UNIT=0 %FINISH PRINTD(THOU,UNIT,10,0) NEWLINES(2) %REPEAT SELECT OUTPUT(2) WRITE(-1,3); NEWLINE ! ! !************************************************************************** ! ! ! ! BLOGY BLOGY BLOGY BLOGY BLOGY BLOGY BLOGY BLOGY BLOGY BLOGY BLOGY BLOGY BLOGY ! BLOGY BLOGY BLOGY BLOGY BLOGY BLOGY BLOGY BLOGY BLOGY BLOGY BLOGY BLOGY BLOGY ! ! %ENDOFPROGRAM !