home *** CD-ROM | disk | FTP | other *** search
- # ifndef lint
- static char SccsId[] = "@(#)vmstat.c 1.1\t10/1/88" ;
- # endif
-
- # ifdef SUNOS40
- # ifndef OLDSTATS
- # include "sps.h"
- # include <h/mman.h>
- # include <vm/hat.h>
- # include <vm/as.h>
- # include <vm/seg.h>
- # include <vm/seg_vn.h>
-
- seg_count ( p )
-
- struct process *p ;
-
- {
- extern struct info Info ;
- struct as as ; /* address space */
- struct seg seg ; /* segment in addr space */
- struct segvn_data vn_data ;
- unsigned private = 0 ;
- unsigned shared = 0 ;
-
- p->pr_private = 0 ;
- p->pr_shared = 0 ;
-
- if ( getkmem( (long)p->pr_p.p_as, &as, sizeof( as ) ) != sizeof( as ) )
- return( -1 ) ;
- seg.s_next = as.a_segs ; /* setup for loop */
- do
- {
- if ( ( getkmem( seg.s_next, &seg, sizeof( seg ) ) )
- != sizeof( seg ) )
- break ;
- if ( seg.s_as != p->pr_p.p_as )
- continue ; /* invalid segment */
- if ( seg.s_ops != Info.i_segvn_ops )
- { /* mapped device is "shared" */
- shared += seg.s_size ;
- continue ;
- }
- if ( getkmem( (long)seg.s_data, &vn_data, sizeof( vn_data ) )
- != sizeof( vn_data ) )
- continue ;
- /*
- * If a segment has an anonymous mapping, it is in the swap
- * area. If it is also MAP_PRIVATE, we consider it "private"
- * (even though it may be shared between parent and child after
- * a fork() call). Segments without an anonymous mapping are
- * considered to be "shared". [Should we worry about swap
- * space reserved for copy-on-write shared segments?]
- */
-
- if ( vn_data.amp && (vn_data.type & MAP_TYPE) == MAP_PRIVATE )
- private += seg.s_size ;
- else
- shared += seg.s_size ;
- }
- while ( seg.s_next != as.a_segs ) ;
-
- # define BYTETOPAGE(x) (((x)+(PAGESIZE-1))>>PGSHIFT)
-
- p->pr_private = BYTETOPAGE( private ) ;
- p->pr_shared = BYTETOPAGE( shared ) ;
- p->pr_p.p_rssize = as.a_rss ; /* update count of resident pages */
- return( 0 ) ;
- }
- # endif
- # endif
-