home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume23 / sps2 / part02 / needed.c < prev    next >
C/C++ Source or Header  |  1991-01-08  |  5KB  |  185 lines

  1. # ifndef lint
  2. static char SccsId[] =  "@(#)needed.c    1.3\t7/4/90" ;
  3. # endif
  4.  
  5. # include       "sps.h"
  6. # include       "flags.h"
  7. # ifndef SUNOS40
  8. # include       <h/text.h>
  9. # endif
  10. # include       <stdio.h>
  11.  
  12. /*
  13. ** NEEDED - Determine which processes are needed for the printout
  14. ** and add these to a list of needed processes.
  15. */
  16. # ifdef SUNOS40
  17. struct process  *needed ( process )
  18.  
  19. register struct process         *process ;
  20.  
  21. # else
  22.  
  23. struct process  *needed ( process, text )
  24.  
  25. register struct process         *process ;
  26. struct text                     *text ;
  27.  
  28. # endif
  29. {
  30.     register struct process *p ;
  31.     register struct process *plist ;
  32.     struct process          *lastp ;
  33.     int                     uid ;
  34.     extern struct flags     Flg ;
  35.     extern union userstate  User ;
  36.     extern struct info      Info ;
  37.     extern struct ttyline   Notty ;
  38.     struct ttyline          *findtty() ;
  39.     char                    *getcmd() ;
  40.  
  41.     plist = (struct process*)0 ;
  42.     lastp = &process[ Info.i_nproc ] ;
  43.     /* Normalise internal pointers from kernel addresses. For each kmem
  44.        address in the `proc' and `text' structures, we convert that
  45.        address for our own internal use. */
  46.     for ( p = process ; p < lastp ; p++ )
  47.     {                               
  48.         if ( !p->pr_p.p_stat )  
  49.             continue ;
  50. # ifndef SUNOS40
  51.         /* Normalise internal text pointers */
  52.         if ( p->pr_p.p_textp )
  53.             p->pr_p.p_textp = &text[p->pr_p.p_textp - Info.i_text0];
  54. # endif
  55.         /* Normalise internal linked list of processes */
  56.         p->pr_plink = p->pr_p.p_link ?
  57.             &process[ p->pr_p.p_link  - Info.i_proc0 ] :
  58.             (struct process*)0 ;
  59.         /* Normalise internal parent pointers */
  60.         p->pr_pptr = p->pr_p.p_pptr ?
  61.             &process[ p->pr_p.p_pptr - Info.i_proc0 ] :
  62.             (struct process*)0 ;
  63.         /* Check for valid parent pointers */
  64.         if ( !p->pr_pptr )
  65.         {
  66.             p->pr_pptr = process ;
  67.             continue ;
  68.         }
  69.         if ( p->pr_pptr < process || p->pr_pptr >= lastp )
  70.         {
  71.             fprintf( stderr, "sps - process %d has bad pptr\n",
  72.                 p->pr_p.p_pid ) ;
  73.             p->pr_pptr = process ;
  74.         }
  75.     }
  76.     /* For each process, see if it is a candidate for selection.
  77.        If so, retrieve its command arguments and upage information. */
  78.     uid = getuid() ;
  79.     for ( p = process ; p < lastp ; p++ )
  80.     {                               
  81.         if ( !p->pr_p.p_stat )
  82.             continue ;
  83.         /* Count processes and sizes */
  84.         summarise( p ) ;
  85.         /* Select the given processes. Bear in mind that selection
  86.            of processes based on the `F' and `T' flags must be
  87.            postponed until the upage is accessed. */
  88.         if ( !Flg.flg_F && !Flg.flg_T && !selectproc( p, process, uid ))
  89.             continue ;
  90.         /* Try to find the process' command arguments. Accessing the
  91.            arguments also involves retrieving the upage. */
  92.         p->pr_cmd = getcmd( p ) ;
  93.         /* If the upage was found successfully, use this information */
  94.         if ( p->pr_upag )       
  95.         {
  96. # ifdef BSD42
  97.             p->pr_rself = User.u_us.u_ru ;
  98.             p->pr_rchild = User.u_us.u_cru ;
  99. # else
  100.             p->pr_vself = User.u_us.u_vm ;
  101.             p->pr_vchild = User.u_us.u_cvm ;
  102. # endif
  103.             p->pr_tty = findtty( p ) ;
  104.             p->pr_files = filecount( p ) ;
  105.         }
  106.         else
  107.             p->pr_tty = &Notty ;
  108.         /* Select on the basis of the `F' and `T' flags */
  109.         if ( Flg.flg_F          
  110.         && !(p->pr_p.p_pgrp && p->pr_p.p_pgrp == p->pr_tty->l_pgrp) )
  111.             continue ;
  112.         if ( Flg.flg_T && !selecttty( p ) )
  113.             continue ;
  114.         /* Arrive here with a selected process. Add this to the
  115.            linked list of needed processes. */
  116.         p->pr_plink = plist ;   
  117.         plist = p ;
  118.         p->pr_child = (struct process*)0 ;
  119.         p->pr_sibling = (struct process*)0 ;
  120.     }
  121.     return ( plist ) ;
  122. }
  123.  
  124. /* SUMMARISE - Summarises the given process into the `Summary' structure */
  125. /*
  126. ** SHOULD ACCOUNT HERE FOR THE SIZE OF LOADED PAGE TABLES, BUT WE DON'T REALLY
  127. ** KNOW THEIR RESIDENT SIZES.
  128. */
  129. summarise ( p )
  130.  
  131. register struct process         *p ;
  132.  
  133. {
  134. # ifndef SUNOS40
  135.     register struct text    *tp ;
  136. # endif
  137.     int                     busy ;
  138.     extern struct summary   Summary ;
  139.  
  140.     Summary.sm_ntotal++ ;
  141.     if ( p->pr_p.p_stat == SZOMB )
  142.         return ;
  143.     /* Firstly, account for processes */
  144. # if defined(OLDSTATS) || !defined(SUNOS40)
  145.     Summary.sm_ktotal += p->pr_p.p_dsize + p->pr_p.p_ssize ;
  146. # else
  147.     seg_count( p ) ;        /* count up process pages */
  148.     
  149.     Summary.sm_ktotal += p->pr_private + p->pr_shared ;
  150. # endif
  151.     Summary.sm_kloaded += p->pr_p.p_rssize ;
  152.     Summary.sm_kswapped += p->pr_p.p_swrss ;
  153.     if ( p->pr_p.p_flag & SLOAD )
  154.         Summary.sm_nloaded++ ;
  155.     else
  156.         Summary.sm_nswapped++ ;
  157.     busy = (p->pr_p.p_stat == SRUN) || (p->pr_p.p_stat==SSLEEP
  158.          && (p->pr_p.p_pri<PZERO && p->pr_p.p_pid > MSPID) ) ;
  159. # ifdef SUNOS40
  160.     /* Ignore the idle processes */
  161.     if ( p->pr_p.p_pid == 3 || p->pr_p.p_pid == 4 )
  162.         busy = 0 ;
  163. # endif SUNOS40
  164.     if ( busy )
  165.     {
  166.         Summary.sm_nbusy++ ;
  167. # if defined(OLDSTATS) || !defined(SUNOS40)
  168.         Summary.sm_kbusy += p->pr_p.p_dsize + p->pr_p.p_ssize ;
  169. # else
  170.         Summary.sm_kbusy += p->pr_private + p->pr_shared ;
  171. # endif
  172.     }
  173. # ifndef SUNOS40
  174.     /* Now account for their texts */
  175.     if ( !(tp = p->pr_p.p_textp) || !tp->x_count )
  176.         return ;                
  177.     Summary.sm_ktotal += tp->x_size ;
  178.     Summary.sm_kloaded += tp->x_rssize ;
  179.     Summary.sm_kswapped += tp->x_swrss ;
  180.     if ( busy )
  181.         Summary.sm_kbusy += tp->x_size ;
  182.     tp->x_count = 0 ;
  183. # endif
  184. }
  185.