	program getws
!++
! FACILITY:	GETWS - Get working set info
!
! ABSTRACT:
!	This program displays working set info for each
!	process and the image being run for each. It is
!	interesting to note: which images require massive
!	amounts of memory; what the peak memory needs are
!	for a particular user; and how effective your working
!	sets are tuned in general.
!
! ENVIRONMENT:	VMS 4.x
!
!
! AUTHOR: Rand P. Hall
!	  Northeastern Univ.
!	  College of Engineering
!	  360 Huntington Ave.
!	  Boston, Ma.
!
! CREATION DATE: May 1985
!
! MODIFIED BY:
!
! VERSION
! 01	- original
!--

	implicit none
	include '($ssdef)'
	include '($jpidef)'

	structure /itmlist/		!For getjpi itemlist.
	 union
	  map
	   integer*2 bufferlen
	   integer*2 itemcode
	   integer*4 bufferaddr
	   integer*4 lengthaddr
	  end map
	  map
	   integer*4 endlist
	  end map
	 end union
	end structure
	
	record /itmlist/ jpi_list(11)

	character	username*12,imagname*80,outstring*10,clear(6)
	integer*4	dfwscnt,wsquota,wsextent,wssize,wspeak,seedpid
	integer*4	ppgcnt,gpgcnt,imagname_addr,e,totalmem,sys$getjpiw
	integer*4	username_l,dfwscnt_l,wsquota_l,wssize_l
	integer*4	wspeak_l,ppgcnt_l,gpgcnt_l,wsextent_l
	integer*4	status,bracket,period,str$left,str$right,str$trim
	integer*4	grp,grp_l
	integer*2	imagname_l
	character	esc

	data clear/27,'[',72,27,'[',74/		!Esc sequence to clear screen.
	data esc/27/

! Set up getjpi itemlist.

	jpi_list(1).bufferlen=12
	jpi_list(1).itemcode=jpi$_username
	jpi_list(1).bufferaddr=%loc(username)
	jpi_list(2).bufferlen=4
	jpi_list(2).itemcode=jpi$_dfwscnt
	jpi_list(2).bufferaddr=%loc(dfwscnt)
	jpi_list(3).bufferlen=4
	jpi_list(3).itemcode=jpi$_wsquota
	jpi_list(3).bufferaddr=%loc(wsquota)
	jpi_list(4).bufferlen=4
	jpi_list(4).itemcode=jpi$_wsextent
	jpi_list(4).bufferaddr=%loc(wsextent)
	jpi_list(5).bufferlen=4
	jpi_list(5).itemcode=jpi$_wssize
	jpi_list(5).bufferaddr=%loc(wssize)
	jpi_list(6).bufferlen=4
	jpi_list(6).itemcode=jpi$_wspeak
	jpi_list(6).bufferaddr=%loc(wspeak)
	jpi_list(7).bufferlen=4
	jpi_list(7).itemcode=jpi$_ppgcnt
	jpi_list(7).bufferaddr=%loc(ppgcnt)
	jpi_list(8).bufferlen=4
	jpi_list(8).itemcode=jpi$_gpgcnt
	jpi_list(8).bufferaddr=%loc(gpgcnt)
	jpi_list(9).bufferlen=60
	jpi_list(9).itemcode=jpi$_imagname
	jpi_list(9).bufferaddr=%loc(imagname)
	jpi_list(9).lengthaddr=%loc(imagname_l)
	jpi_list(10).bufferlen=4
	jpi_list(10).itemcode=jpi$_grp
	jpi_list(10).bufferaddr=%loc(grp)
	jpi_list(10).lengthaddr=%loc(grp_l)
	jpi_list(11).endlist=jpi$c_listend

	seedpid=-1				! Wildcard pid context.
	e=0

! Clear screen, write heading, and set scrolling region.

	write(*,5)clear
	write(*,6)
5	format(1h+,6a1)
6	format(2x,'User         wdef/wquo/wsiz/wext peak mem ',
	1' pcnt gcnt    image')
	type*,esc,'[3;23r'
	type*,' '

! Do this for all processes except system processes.

	do while (e.ne.ss$_nomoreproc)
	  e=sys$getjpiw(,seedpid,,jpi_list,,,)
	  if ((e.eq.ss$_normal).and.(grp.GE.1)) then

! Total memory consumed is process paged plus group paged (sharable).

	    totalmem=ppgcnt+gpgcnt

! Strip all but the imagename.

	    bracket=1
	    do while (bracket.ne.0)
	      bracket=index(imagname,']')
	      e=str$right(imagname,imagname,bracket+1)
	    enddo
	    period= index(imagname,'.')-1
	    status=str$left(outstring,imagname,period)

! Write an output record.

	    write(*,10)username,dfwscnt,wsquota,wssize,wsextent,wspeak,
	1   totalmem,ppgcnt,gpgcnt,outstring
	  endif
	enddo
10	format(1x,a12,1x,3(i4,'|'),i4,1x,i4,1x,i4,1x,
	1	i4,1x,i4,4x,a10)
	type*,esc,'[0;24r',esc,'[23;1H'		!Reset scrolling region.
	end

