%CONTROL 0 ! !VAGRANCY AIDS FOR USERS MK.1 !J.C.A. 17:05:74 ! %EXTERNALROUTINE VAGRANCY(%STRING(63) S) ! !TAKES A FILE OF TRACE INFO FROM BUGGED COMPILER OR INTERPRETER !GIVES SUMMARY OF RESULTS IN FILE !GIVES PAGE TURNS & CPU USED IN EACH CALL OF A ROUTINE !PLUS RATIOS OF PAGEFAULTS V CPU TIME ! %EXTERNALROUTINESPEC DEFINE(%STRING(63) S) %EXTERNALROUTINESPEC SET MARGINS(%INTEGER STREAM,LHM,RHM) ! %RECORDFORMAT HOLDE(%INTEGER CPU,PTURN,%SHORTINTEGER ENTRY,EXIT) %INTEGER FILE,DATAPTR,ENDPTR,F %INTEGER RTWAS,CPUIS,CPUWAS,PTURNIS,PTURNWAS %INTEGER RTIS %RECORDARRAY HOLD(0:127)(HOLDE) %OWNSTRING(8) RESULT='.TT' %CONSTINTEGER FLTCH=2 ;!CHARGE IN CPU MILLISECS FOR PAGE FAU %CONSTINTEGER SVCCH=2 ! ! %ROUTINE FDP(%INTEGER EP,%STRING(17) NAME,%INTEGER P1,P2,%C %INTEGERNAME FLAG) %RECORDFORMAT AGFM(%INTEGER EP,%STRING(17) NAME,%INTEGER P1,P2,%C %INTEGERNAME FLAG) %SYSTEMROUTINESPEC AGENCY(%INTEGER P1,%RECORDNAME P) %RECORD P(AGFM) *OI_4(13),5 **1,@P *LA_2,EP *MVC_0(36,1),0(2);! MOVE IN PARMS AGENCY(1,P) %END %INTEGERFN OLDFILE(%STRING(17) FILE,%INTEGER MODE,SIZE) %SHORTROUTINE !CONNECTS FILE AND CHECKS SUCESS !RETURNS START ADDRESS OF FILE %INTEGER FLAG,PTR PTR=ADDR(SIZE) FDP(1,FILE,MODE,PTR,FLAG) %IF FLAG=0 %OR FLAG=5 %THEN %RESULT=SIZE PRINTSTRING('CONNECT FAIL '.FILE) WRITE(FLAG,6) NEWLINES(2) %RESULT=-1 ;!FAIL RESULT %END ;!FN OLDFILE %ROUTINE HEADING !PRINTS HEADING FOR RESULTS ! PRINTSTRING('*** ANTI-VAGRANCY AIDS FOR USERS MK.1 *** ') PRINTSTRING('*** PAGEFAULTS AND CPUTIME(MILLISECS)') PRINTSTRING(' PER ROUTINE CALL *** ') PRINTSTRING('*** PAGEFAULT CHARGE(2 CPU MILLISECS)') PRINTSTRING(' REMOVED FROM CPU TIME *** ') NEWLINE PRINTSTRING('ROUTINE CALL EXIT CPUTOT') PRINTSTRING(' PTTOT CPUAV PTRNAV PTURN/SEC') NEWLINE %END ;!RT HEADING ! %ROUTINE GATHER !GATHERS INFO ON CPU & PAGEFAULTS USED IN CALL ON RT'S !IF TOP BIT OF RECORD SET - A CALL ON A RT ! - RECURSIVE CALL ON GATHER TO DEAL WITH LOWER !IF TOP BIT OF RECORD CLEAR - AN EXIT FROM A RT ! - RETURN FROM THIS LEVEL OF GATHER ! %INTEGER RT ! %ROUTINE IS TO WAS !COPY CURRENT INTO PAST VALUES RTWAS=RTIS CPUWAS=CPUIS PTURNWAS=PTURNIS DATAPTR=DATAPTR+8 ;!TO NEXT RECORD %END ;!RT ISTOWAS ! %ROUTINE UPDATE(%INTEGER RT) !UPDATE INFO ON THIS RT HOLD(RT)_CPU=HOLD(RT)_CPU+(CPUIS-CPUWAS) HOLD(RT)_PTURN=HOLD(RT)_PTURN+(PTURNIS-PTURNWAS) %END ;!RT UPDATE ! !MAIN RT BODY ! 1: %IF DATAPTR>ENDPTR %THEN %RETURN ;!END OF DATA CPUIS=INTEGER(DATAPTR)&X'7FFFFFFF' ;!CPU SO FAR PTURNIS=INTEGER(DATAPTR+4)&X'00FFFFFF' ;!PAGE FLTS SO FAR RTIS=BYTEINTEGER(DATAPTR+4)&127 ;!ROUTINE NUMBER !ENTRY OR EXIT ? %IF BYTEINTEGER(DATAPTR)&X'80'=0 %THEN ->EXIT ;!EXIT! !ENTRY HOLD(RTIS)_ENTRY=HOLD(RTIS)_ENTRY+1 UPDATE(RTWAS) ;!UPDATE DATE FOR SUPERIOR RT RT=RTWAS ;!REMEMEBER SUPERIOR RT ISTOWAS GATHER ;!DEAL WITH LOWER LEVELS ! RTWAS=RT ;!BACK AT THIS LEVEL RESTORE SUPERIOR RT ->1 ;!DEAL WITH NEXT RECORD !EXIT EXIT: HOLD(RTIS)_EXIT=HOLD(RTIS)_EXIT+1 UPDATE(RTIS) ISTOWAS %RETURN ;!GO BACK UP A LEVEL ! %END ;!RT GATHER ! %ROUTINE PRLINE(%INTEGER F) !DUMPS A LINE OF SUMMARY INFO FOR ONE RT %INTEGER J %RECORDNAME H(HOLDE) %CONSTINTEGER WRP=7 %CONSTINTEGER MARG=10 ! J=FILE+9*F+16 ;!ADDR OF RT NAME PRINTSTRING(STRING(J)) SPACES(MARG-LENGTH(STRING(J))) H == HOLD(F) WRITE(H_ENTRY,WRP-2) WRITE(H_EXIT,WRP-2) WRITE(H_CPU,WRP) WRITE(H_PTURN,WRP) PRINT(H_CPU/H_ENTRY,WRP-3,3) PRINT(H_PTURN/H_ENTRY,WRP-3,3) %IF H_CPU#0 %THEN PRINT(H_PTURN*1000/H_CPU,WRP,0) %C %ELSE PRINTSTRING(' ZERO CPU') NEWLINE %END ;!RT PRLINE ! !GET FILE ! FILE=OLDFILE('II#DATA',3,0) %IF FILE=-1 %THEN %STOP DATAPTR=INTEGER(FILE+12)+FILE ENDPTR=INTEGER(FILE)+FILE RESULT<-S %UNLESS S='' ;!RESULTFILE DEFINE('STREAM09,'.RESULT) SELECTOUTPUT(9) SETMARGINS(9,1,132) ! %CYCLE F=0,1,127 HOLD(F)_CPU=0 HOLD(F)_PTURN=0 HOLD(F)_ENTRY=0 HOLD(F)_EXIT=0 %REPEAT ! ! !GET FIRST VALUES ! CPUWAS=INTEGER(DATAPTR)&X'7FFFFFFF' PTURNWAS=INTEGER(DATAPTR+4)&X'00FFFFFF' RTWAS=BYTEINTEGER(DATAPTR+4)&127 ! !COLLECT DATA ! GATHER !REMOVE CHARGE FOR PAGEFAULTS %CYCLE F=0,1,127 %IF HOLD(F)_ENTRY#0 %THEN%START HOLD(F)_CPU=HOLD(F)_CPU-HOLD(F)_PTURN*FLTCH !REMOVE CHARGE FOR SVC HOLD(F)_CPU=HOLD(F)_CPU-(HOLD(F)_ENTRY+HOLD(F)_EXIT)*SVCCH %IF HOLD(F)_CPU<0 %THEN HOLD(F)_CPU=0 %FINISH %REPEAT ! !NOW DROP RESULTS ! HEADING %CYCLE F=0,1,127 %IF HOLD(F)_ENTRY#0 %THEN PRLINE(F) %REPEAT ! %END ;!RT VAGRANCY ! %ENDOFFILE