home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume26 / sps3 / part02 / needed.c < prev    next >
C/C++ Source or Header  |  1992-05-08  |  5KB  |  191 lines

  1. # ifndef lint
  2. static char SccsId[] =  "@(#)needed.c    1.4\t6/26/91" ;
  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.         if ( p->pr_p.p_stat == SIDL )
  84.             continue ;
  85.         /* Count processes and sizes */
  86.         summarise( p ) ;
  87.         /* Select the given processes. Bear in mind that selection
  88.            of processes based on the `F' and `T' flags must be
  89.            postponed until the upage is accessed. */
  90.         if ( !Flg.flg_F && !Flg.flg_T && !selectproc( p, process, uid ))
  91.             continue ;
  92.         /* Try to find the process' command arguments. Accessing the
  93.            arguments also involves retrieving the upage. */
  94.         p->pr_cmd = getcmd( p ) ;
  95.         /* If the upage was found successfully, use this information */
  96.         if ( p->pr_upag )       
  97.         {
  98. # ifdef BSD42
  99.             p->pr_rself = User.u_us.u_ru ;
  100.             p->pr_rchild = User.u_us.u_cru ;
  101. # else
  102.             p->pr_vself = User.u_us.u_vm ;
  103.             p->pr_vchild = User.u_us.u_cvm ;
  104. # endif
  105.             p->pr_tty = findtty( p ) ;
  106.             p->pr_files = filecount( p ) ;
  107.         }
  108.         else
  109.             p->pr_tty = &Notty ;
  110.         /* Select on the basis of the `F' and `T' flags */
  111.         if ( Flg.flg_F          
  112.         && !(p->pr_p.p_pgrp && p->pr_p.p_pgrp == p->pr_tty->l_pgrp) )
  113.             continue ;
  114.         if ( Flg.flg_T && !selecttty( p ) )
  115.             continue ;
  116.         /* Arrive here with a selected process. Add this to the
  117.            linked list of needed processes. */
  118.         p->pr_plink = plist ;   
  119.         plist = p ;
  120.         p->pr_child = (struct process*)0 ;
  121.         p->pr_sibling = (struct process*)0 ;
  122.     }
  123.     return ( plist ) ;
  124. }
  125.  
  126. /* SUMMARISE - Summarises the given process into the `Summary' structure */
  127. /*
  128. ** SHOULD ACCOUNT HERE FOR THE SIZE OF LOADED PAGE TABLES, BUT WE DON'T REALLY
  129. ** KNOW THEIR RESIDENT SIZES.
  130. */
  131. summarise ( p )
  132.  
  133. register struct process         *p ;
  134.  
  135. {
  136. # ifndef SUNOS40
  137.     register struct text    *tp ;
  138. # endif
  139.     int                     busy ;
  140.     extern struct summary   Summary ;
  141.  
  142.     Summary.sm_ntotal++ ;
  143.     if ( p->pr_p.p_stat == SZOMB )
  144.         return ;
  145.     /* Firstly, account for processes */
  146. # if defined(OLDSTATS) || !defined(SUNOS40)
  147.     Summary.sm_ktotal += p->pr_p.p_dsize + p->pr_p.p_ssize ;
  148. # else
  149.     seg_count( p ) ;        /* count up process pages */
  150.     
  151.     Summary.sm_ktotal += p->pr_private + p->pr_shared ;
  152. # endif
  153.     Summary.sm_kloaded += p->pr_p.p_rssize ;
  154.     Summary.sm_kswapped += p->pr_p.p_swrss ;
  155. # ifdef ULTRIX40
  156.     if ( p->pr_p.p_sched & SLOAD )
  157. # else
  158.     if ( p->pr_p.p_flag & SLOAD )
  159. # endif
  160.         Summary.sm_nloaded++ ;
  161.     else
  162.         Summary.sm_nswapped++ ;
  163.     busy = (p->pr_p.p_stat == SRUN) || (p->pr_p.p_stat==SSLEEP
  164.          && (p->pr_p.p_pri<PZERO && p->pr_p.p_pid > MSPID) ) ;
  165. # ifdef SUNOS40
  166.     /* Ignore the idle processes */
  167.     if ( p->pr_p.p_pid == 3 || p->pr_p.p_pid == 4 )
  168.         busy = 0 ;
  169. # endif SUNOS40
  170.     if ( busy )
  171.     {
  172.         Summary.sm_nbusy++ ;
  173. # if defined(OLDSTATS) || !defined(SUNOS40)
  174.         Summary.sm_kbusy += p->pr_p.p_dsize + p->pr_p.p_ssize ;
  175. # else
  176.         Summary.sm_kbusy += p->pr_private + p->pr_shared ;
  177. # endif
  178.     }
  179. # ifndef SUNOS40
  180.     /* Now account for their texts */
  181.     if ( !(tp = p->pr_p.p_textp) || !tp->x_count )
  182.         return ;                
  183.     Summary.sm_ktotal += tp->x_size ;
  184.     Summary.sm_kloaded += tp->x_rssize ;
  185.     Summary.sm_kswapped += tp->x_swrss ;
  186.     if ( busy )
  187.         Summary.sm_kbusy += tp->x_size ;
  188.     tp->x_count = 0 ;
  189. # endif
  190. }
  191.