.TITLE UEAJPI
; Collect process data for JOB_MONITOR
; VMS V5 version June 1989 ... KMW
; Based on Microfiche 363 N13 $MONITOR GETSPI routine.
; 1) NULL data no longer available
; 2) Use SMPLOCK to sync PCB access
;
.PSECT JPI,LONG,PIC,USR,OVR,REL,GBL,SHR,NOEXE,RD,WRT,NOVEC
PIDLIST: .BLKL 200 ; pid
EPIDLIST: .BLKL 200 ; epid
DIOLIST: .BLKL 200 ; direct i/o
BIOLIST: .BLKL 200 ; buffered i/o
CPULIST: .BLKL 200 ; cpu time 100ms ticks ?
PFLLIST: .BLKL 200 ; page faults
GRPLIST: .BLKL 200 ; uic
MEMLIST: .BLKL 200
PRNLIST: .BLKQ 200 ; 1st part proc. name
PRN2LIST: .BLKQ 200 ; 2nd part proc. name
TRMLIST: .BLKQ 200 ; terminal id.
OPIDLIST: .BLKL 200 ; pid of owner process if subprocess
PRILIST: .BLKL 200 ; process base priority
.PSECT DATA
$PCBDEF GLOBAL
$PHDDEF GLOBAL
$IPLDEF GLOBAL
.PSECT CODE
JPISTART::
.ENTRY UEAJPI,^M<R2,R3,R4,R5,R6,R7,R8,R9,R10,R11>
CLRL R4 ; data pointer
CLRL R5 ; proc. counter
MOVL G^SCH$GL_PCBVEC,R2 ; top of PCB
MOVL (R2),R0 ; addr. of NULL's PCB
MOVL R0,R6 ; remember NULL's PCB addr.
; MOVL PCB$L_PID(R0),R7 ; NULL's PID
MOVL #1,R3 ; VMS 5 start at index 1
; CLRL R3 ; current pix
; BRB 30$ ; to get NULL's data
10$:
; SETIPL 80$ ; sync use of PCB
SMPLOCK LOCKNAME=SCHED,LOCKIPL=#8
MOVL (R2)[R3],R0 ; next PCB
MOVL PCB$L_PID(R0),R7 ; & it's PID
; SETIPL #0 ; back to IPL 0
SMPUNLOCK LOCKNAME=SCHED,NEWIPL=#0
CMPL R6,R0 ; empty slot ?
BNEQ 30$ ; no, so get data
BRW 70$ ; yes, so skip it
30$:
MULL3 #2,R4,R8
ADDL2 #4,R8 ; quadword pointer
MOVL PCB$L_PID(R0),L^PIDLIST(R4)
MOVL PCB$L_EPID(R0),L^EPIDLIST(R4)
MOVZWL PCB$W_GRP(R0),L^GRPLIST(R4)
MOVZWL PCB$W_MEM(R0),L^MEMLIST(R4)
MOVL PCB$L_OWNER(R0),L^OPIDLIST(R4)
MOVZBL PCB$B_PRIB(R0),L^PRILIST(R4)
MOVQ PCB$T_TERMINAL(R0),L^TRMLIST(R8)
MOVQ PCB$T_LNAME(R0),L^PRNLIST(R8)
MOVQ PCB$T_LNAME+8(R0),L^PRN2LIST(R8)
; SETIPL 80$ ; sync
SMPLOCK LOCKNAME=SCHED,LOCKIPL=#8
MOVZWL R7,R1 ; PID to PCB index
MOVL (R2)[R1],R1 ; PCB addr.
CMPL PCB$L_PID(R1),R7 ; still same PID ?
BEQLU 40$ ; yes
; SETIPL #0
SMPUNLOCK LOCKNAME=SCHED,NEWIPL=#0
BRW 70$ ; no so skip it.
40$: MOVL PCB$L_STS(R0),R7 ; save status field
BBS #PCB$V_RES,R7,50$ ; PHD resident ?
; SETIPL #0
SMPUNLOCK LOCKNAME=SCHED,NEWIPL=#0
CLRQ R8
CLRQ R10
BRB 60$ ; no stats. available
50$: MOVL PCB$L_PHD(R0),R1 ; PHD addr.
MOVL PHD$L_PAGEFLTS(R1),R8 ; use registers to avoid page faults
MOVL PHD$L_CPUTIM(R1),R9
MOVL PHD$L_BIOCNT(R1),R10 ;
MOVL PHD$L_DIOCNT(R1),R11 ;
; SETIPL #0
SMPUNLOCK LOCKNAME=SCHED,NEWIPL=#0
60$:
MOVL R8,L^PFLLIST(R4) ; now move data to buffers
MOVL R9,L^CPULIST(R4)
MOVL R10,L^BIOLIST(R4)
MOVL R11,L^DIOLIST(R4)
INCL R5 ; process count
ADDL2 #4,R4 ; buffer pointer, all saved in longwords
70$: ACBL G^SCH$GL_MAXPIX,#1,R3,10$ ; next entry
MOVL R5,@4(AP)
MOVL #1,R0
RET
80$: .LONG IPL$_SYNCH
JPIFINISH::
.END