.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