TITLE CPUTIM SEARCH MONSYM SEARCH MACSYM ;SIAMAK AFSOOS JAN-21-1982 ;THIS PROGRAM SORTS USERS BY THE AMOUNT OF CPU TIME THEY HAVE ;TAKEN IN A GIVEN TIME. ;LAST EDIT - SIAMAK AFSOOS ;REVISED - SIAMAK AFSOOS .REQUIRE SYS:MACREL P==17 OPDEF CALL [PUSHJ P,] ;CALL A SUBROUTINE OPDEF RET [POPJ P,] ;RETURN FROM A SUBROUTINE SALL ;CLEAN LISTING ;PROGRAM VERSION VWHO==2 ;WRITTEN BY A NON-DEC PERSONAL VMAJOR==1 ;MAJOR CHANGES VMINOR==0 ;MINOR CHANGES VEDIT==3 ;EDIT VERSION BYTE (3)2(9)VMAJOR(6)VMINOR(18)VEDIT ;ENTRY VECTOR EVEC: JRST START ;START ENTRY POINT JRST START ;REENTER POINT BYTE (3)2(9)VMAJOR(6)VMINOR(18)VEDIT EVECL==.-EVEC ; [2] ;SUBSYSTEM PROGRAM NAME JUN-5-82 ; [3] ;DIREC CPU.INI INSTEAD OF SYS:CPU.INI start: RESET move p,[iowd ^d100,stack] ;INITIALIZATION movsi 1,(gj%old!gj%sht) hrroi 2,[asciz/cpu.ini/] gtjfn ;GET SLEEP TIME FROM CPU.INI jrst default ;NO CPU.INI, DEFAULT SLEEP TIME movem 1,jfn ;SAVE JFN move 1,jfn move 2,[7b5+of%rd] openf jrst default ;ERROR,NO OPEN, DEFAULT AGAIN move 1,jfn movei 3,^d10 nin ;GET SLEEP TIME FROM CPU.INI jrst default ;ERROR,USE DEFAULT SLEEP TIME movem 2,set ;SAVE TIME FROM CPU.INI SL2: call old ;JOB NUM AND CPU TIME BEF SLEEP call intrpt ;CREATE INF PROCE AND START IT. call watch ;HAS ANYBODY LOGGED OUT? jrst .-1 ;CONTINUE TILL TIMER GOES OFF OVER: call new ;GET JOB AND CPU AFTER SLEEP call subt ;CPU TIME USED DURING SLEEP. ; COMMENT/THIS PART ADDS UP ALL CPU USED BY USERS ALCPU IS THE TOTAL CPU TIME IN MICRO SECONDS/ SETZ 4, CPLOOP: MOVE 1,NEWCPU(4) ADDM 1,ALCPU AOJ 4, CAMG 4,13 JRST CPLOOP ; call sort ;SORT USERS BASED ON CPU. call mine ;GET SOME INFO ABOUT ME call time ;DAYTIME AND DATE call sysup ;TIME SYSTEM HAS BEEN UP CALL JOBS ;find number of jobs on system call jobOUT ;output the result call ldaver ;load averages 1,5,15 minutes call header ;just a header CALL OUTPUT ;ouput everything about a job HALTF ; comment/ this section takes care of errors and then halts the program/ ERROR: HRROI 1,ERBLK ;ERROR HANDLING MOVE 2,[.FHSLF,,-1] ;CURRENT FORK,LAST ERROR SETZ 3, ERSTR JFCL JFCL HRROI 1,ERBLK ESOUT ; ERBLK: BLOCK ^D30 STORE: BLOCK ^D250 STACK: BLOCK ^D100 OLDCPU: BLOCK ^D100 OLDJOB: BLOCK ^D100 NEWCPU: BLOCK ^D100 FLNAME: BLOCK 5 JFN: BLOCK 1 SET: BLOCK 1 HANDLE: BLOCK 1 RETPC: BLOCK 1 myjob: block 1 alcpu: z ; comment/sleep for desired time.sleep time is sent eighter from cpu.ini(set) or it is set by default time./ SLEEP: MOVE 2,SET IMULI 2,^D1000 MOVE 1,2 DISMS ;SLEEP,stop and start HALTF ; ; comment/ channel and level tables/ CHNTAB: REPEAT ^D19, 1,,OVER REPEAT ^D15, ;USE CH 19 ONLY LEVTAB: RETPC 0 0 SUBTTL SUBROUTINE TO ENABLE INTRUPT SYSTEM ; ;subroutine to enable software intrupt system on channel 19 for inferior ; process termination and then create and start on inferior process as ;timer intrpt: movx 1,.fhslf move 2,[levtab,,chntab] sir ;set level and channel tabale movx 2,1b<.icift> aic ;activate chan 19 for inferior eir ;process termination ;create and then start the inferior process movx 1,cr%map+cr%st+sleep cfork jrst [jshlt] ;fatal jsys error,print,halt movem 1,handle ret ; SUBTTL SUBROUTINE TO GET INFORMATION ON USERS ;subroutine to get all users job number and cpu since they been ;on system old: setz 13, movei 1,^d250 again2: cain 1,1 jrst again6 soj 1, movem 1,5 move 2,[-250,,store] setz 3, getji jrst[move 1,5 jrst again2] move 2,store+.jirt ;get cpu jumpe 2,again2 movem 2,oldcpu(13) ;save cpu movem 5,oldjob(13) aoj 13, move 1,5 jrst again2 again6: ret ; SUBTTL SUBROUTINE TO WATCH USERS ;subroutine to watch the connection of users to system and take them ;off the list in the case of disconnection watch: setz 4, wloop: move 1,oldjob(4) move 2,[-250,,store] setz 3, getji jrst[ setzm oldjob(4) ;is job logged out?set cpu to zero setzm oldcpu(4) jrst find] FIND: aoj 4, camg 4,13 jrst wloop ret ; SUBTTL SUBROUTINE TO GET INFO ON USERS ;subroutine to get all users job and cpu after time goes off new: setz 4, nloop: move 1,oldjob(4) jumpe 1,yes move 2,[-250,,store] setz 3, getji jrst yes move 2,store+.jirt ;get new cpu movem 2,newcpu(4) yes: aoj 4, camg 4,13 jrst nloop ret ; SUBTTL SUBROUTINE TO FIND CPU ;subroutine to find cpu time for each users during sleep time. subt: setz 4, sloop: move 1,oldjob(4) jumpe 1,syes move 2,newcpu(4) sub 2,oldcpu(4) movem 2,newcpu(4) syes: aoj 4, camg 4,13 jrst sloop ret SUBTTL SUBROUTINE TO GET ME ;SUBROUTINE TO GET SOME INFO ABOUT CONNECTED DIRECTORY MINE: GJINF MOVEM 3,MYJOB ;save my job number RET SUBTTL SUBROUTINE TO FINE SYSUP TIME ;SUBROUTINE TO RETURN THE TIME THAT SYSTEM HAS BEEN UP IN FORM ;HR:MIN:SEC SYSUP: TMSG< Up > TIME ;sys time up in micro seconds IDIVI 1,^D1000 ;MICRO SEC MOVEM 1,TOTAL# ;SAVE IT IDIVI 1,^D3600 ;CONVERT TO HOUR MOVEM 1,SAVHO# ;SAVE IT IMULI 1,^D3600 MOVE 2,TOTAL SUB 2,1 IDIVI 2,^D60 ;CONVERT TO MINUTE MOVEM 2,SAVMN# IMULI 2,^D60 MOVE 1,SAVHO IMULI 1,^D3600 ADD 2,1 MOVE 3,TOTAL SUB 3,2 MOVEM 3,SAVSE# MOVE 2,SAVHO MOVEI 1,.PRIOU MOVEI 3,^D10 NOUT ;HOUR ERJMP ERROR TMSG<:> MOVE 2,SAVMN MOVEI 1,.PRIOU NOUT ;MINUTE ERJMP ERROR TMSG<:> MOVE 2,SAVSE MOVEI 1,.PRIOU NOUT ;SECOND ERJMP ERROR RET SUBTTL SUBROUTINE TO FIND TIME OF DAY ;SUBROUTINE TO SHOW DAYTIME TMSG< > TIME: TMSG< > MOVEI 1,.PRIOU MOVNI 2,1 MOVE 3,[1B1] ODTIM RET SUBTTL SUBROUTINE TO SORT ;subroutine to sort all the users in ascending order ;a simple methode is ueds so it takes a lot of time sort: setz 12, AGAIN: MOVEI 4,0 SETZM FLAG# SETZ 8, LOOP3S: ADDI 8,1 CAMGE 8,13 ;INNER LOOP JRST CONTIS JRST CHECKS CONTIS: MOVE 6,NEWCPU(4) MOVE 15,OLDJOB(4) AOJ 4, MOVE 7,NEWCPU(4) MOVE 14,OLDJOB(4) CAML 6,7 JRST LOOP3S EXCH 6,7 EXCH 15,14 SUBI 4,1 MOVEM 6,NEWCPU(4) MOVEM 15,OLDJOB(4) ADDI 4,1 MOVEM 7,NEWCPU(4) MOVEM 14,OLDJOB(4) MOVEI 16,1 MOVEM 16,FLAG CHECKS: MOVE 5,FLAG CAIE 5,0 ;has any exechange made? JRST AGAIN ;yes go through data again OUT2S: RET SUBTTL SUBROUTINE TO FIND SYSTEM USERS ;SUBROUTINE TO RETURN NUMBER OF USERS ;AC6 HAS NUMBER OF NON-OPERATOR USERS, AND AC5 HAS NUMBER OF ;OPERATORS JOBOUT: TMSG< > MOVE 2,6 TMSG< > MOVEI 1,.PRIOU MOVEI 3,^D10 NOUT ;OUTPUT NUMBER OF USERS ERJMP ERROR TMSG<+> MOVE 2,5 MOVEI 1,.PRIOU NOUT ;OUTPUT NUMBER OF OPERATORS ERJMP ERROR TMSG< Jobs > RET SUBTTL SUBROUTINE TO FIND LOAD AVERAGE ;SUBROUTINE TO RETURN 1,5,AND 15 MINUTES AVRERAGE OF RUNNABLE ;PROCESS LDAVER: tmsg< Load Av> movsi 1,14 ;ld ave in 1 min hrri 1,.systa getab erjmp error move 2,1 movei 1,.priou MOVX 3,1B1+1B4+1B6+37B17+1B22+1B28 flout erjmp error tmsg< > movsi 1,15 ;ld ave in 5 minu hrri 1,.systa getab erjmp error move 2,1 movei 1,.priou movx 3,1b1+1b4+1b6+37b17+4b23+2b29 flout erjmp error tmsg< > movsi 1,16 ;ld ave in 15 min hrri 1,.systa getab erjmp error move 2,1 movei 1,.priou movx 3,1b1+1b4+1b6+37b17+4b23+2b29 flout erjmp error TMSG< > RET ; comment/ THIS PART SETS DEFAULT TIME IF PROGRAM FAILS TO FIND CPU.INI OR EVEN FAILS TO OPEN IT TO GET SLEEP TIME. DEFAULT SLEEP TIME IS 120 SECONDS. / DEFAULT: MOVX 1,^D120 MOVEM 1,SET JRST SL2 ; SUBTTL SUBROUTINE TO PUT A HEADER ;SUBROUTINE TO OUT PUT A HEADER HEADER: TMSG< Job Line Program State Time %Cpu User > RET SUBTTL SUBROUTINE TO FIND SYSTEM USERS ;SUBROUTINE TO FIND NUMBER OF NON-OPERATOR AND OPERATORS WHO ;ARE CURRENTLY ON SYSTEM JOBS: SETZB 2,3 SETZB 6,4 SETZ 5, MOVEI 1,^D250 GOSY2: CAIN 1,1 JRST LINE2 SOJ 1, MOVEM 1,HOLD2# MOVE 2,[-250,,STORE] SETZ 3, GETJI JRST[MOVE 1,HOLD2 JRST GOSY2] SETZ 2, MOVE 2,STORE+.JIUNO ;USER NUMBER CAIN 2,0 JRST GOSY2 HRR 4,2 CAIE 4,5 ;CHECK FOR OPER DIR NUM JRST USECOU AOJ 5, ;COUNTER FOR OPERATOR JRST GOSY2 USECOU: AOJ 6, ;COUNTER FOR USER(NOT OPER) JRST GOSY2 LINE2: RET SUBTTL SUBROUTINE TO FIND INFO ABOUT A JOB ; SUBROUTINE TO OUTPUT ALL INFO ABOUT A JOB OUTPUT: SETZ 4, OUT: MOVE 1,OLDJOB(4) MOVE 2,[-250,,STORE] SETZ 3, GETJI JRST GOSH2 MOVE 2,OLDJOB(4) JUMPE 2,GOSH2 TMSG< > MOVEI 1,.PRIOU MOVEI 3,^D10 NOUT ;JOB NUMBER ERJMP ERROR CAMN 2,MYJOB ;IS IT ME TMSG<*> ;YES.PUT A "*" MOVEI 1,^D9 PBOUT ;TAB OVER ERJMP ERROR MOVEI 1,.PRIOU MOVE 2,STORE+.JITNO ;OCTAL LINE NUMBER MOVS 2,2 CAIGE 2,0 ;IS LINE NOT DETTACHED JRST OH ;YES IT IS HLRZ 2,2 MOVEI 3,^D8 NOUT ;TAB OVER ERJMP ERROR JRST OH3 OH: TMSG ;LINE IS DETTACHED OH3: MOVEI 1,^D9 PBOUT SETZ 5, skipn 1,store+.jipnm ;[2] get program name JRST[move 2,[point 6,store+.jisnm] ;if none use subsy name JRST LOOPS2] MOVE 2,[POINT 6,STORE+.JIPNM] ;ASCII PROGRAM NAME LOOPS2: ILDB 1,2 JUMPE 1,CONTS2 ADDI 1,^D32 PBOUT ;CONVERT TO ASCIZ JRST LOOPS2 CONTS2: MOVEI 1,^D9 PBOUT CALL STATE ;is job running or waiting for input? MOVEI 1,^D9 PBOUT MOVE 5,NEWCPU(4) MOVEM 5,8 MOVE 1,5 MOVEM 1,CPTOT# ;TOTAL MICROM SEC IDIVI 1,^D1000 MOVEM 1,CPSEC# ;SAVE SEC IDIVI 1,^D60 MOVEM 1,CPMIN# ;SAVE MIN IMULI 1,^D60 MOVE 2,CPSEC SUB 2,1 MOVEM 2,CPSEC2# MOVE 2,CPSEC IMULI 2,^D1000 MOVE 1,CPTOT SUB 1,2 MOVEM 1,CPMIC# MOVE 2,CPMIN ;MINUTES movei 1,.priou movei 3,^d10 nout erjmp error tmsg<:> MOVE 2,CPSEC2 caige 2,^d10 tmsg<0> movei 1,.priou ;SECONDS movei 3,^d10 nout erjmp error TMSG<:> MOVE 2,CPMIC CAIGE 2,^D10 JRST[ TMSG<00> JRST TWO] CAIGE 2,^D100 TMSG<0> TWO: MOVEI 1,.PRIOU MOVEI 3,^D10 NOUT ERJMP ERROR TMSG< > MOVEI 1,^D9 PBOUT MOVE 2,ALCPU ;GET ALL CPU FLTR 2,2 ;CONVERT TO REAL MOVE 1,8 IMULI 1,^D100 FLTR 1,1 ;CONVERT TO REAL FDVR 1,2 MOVE 2,1 MOVEI 1,.PRIOU MOVX 3,1B1+1B4+1B6+37B17+4B23+3B29 FLOUT ERJMP ERROR MOVEI 1,^D9 PBOUT TMSG< > MOVE 2,STORE+.JIUNO ;USER 36 BIT NUMBER CAIE 2,0 ;IS IT LOGGED IN? JRST PISH2 TMSG JRST GOSH2 PISH2: MOVEI 1,.PRIOU DIRST ;CONVERT USER NUM TO STRING ERJMP ERROR GOSH2: AOJ 4, CAML 4,13 RET TMSG< > JRST OUT RET SUBTTL SUBROUTINE TO RETURN STATE OF A JOB ;SUBROUTINE TO RETURN THE STATE OF A TERMINAL ;RUN,TERMINAL IS RUNNING ;TI,TERMINAL IS IN TERMINAL INPUT MODE STATE: MOVE 2,STORE+.JITNO MOVSI 1,(2) IORI 1,.TTYJO GETAB ERJMP ERROR ANDI 1,-1 ;keep left side CAIN 1,-1 JRST [TMSG RET] TMSG RET HALTF END