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

  1. # ifndef lint
  2. static char SccsId[] =  "@(#)mktree.c    1.1\t10/1/88" ;
  3. # endif
  4.  
  5. # include       "sps.h"
  6.  
  7. /*
  8. ** MKTREE - Sort the needed processes by subtree and at the top by user.
  9. ** This procedure takes a list of processes (as returned by needed())
  10. ** and returnes a pointer to a sorted list.
  11. */
  12. struct process  *mktree ( process, plist )
  13.  
  14. struct process                  *process ;
  15. struct process                  *plist ;
  16.  
  17. {
  18.     register struct process *p ;
  19.     register struct process *pp ;
  20.     register struct process *lp ;
  21.     struct process          *op ;
  22.     struct process          proot ;
  23.  
  24.     proot.pr_sibling = (struct process*)0 ;
  25.     for ( p = plist ; p ; p = p->pr_plink )
  26.     {
  27.         if ( p->pr_pptr > &process[1] )
  28.         {
  29.             for ( pp = plist ; pp ; pp = pp->pr_plink )
  30.             {
  31.                 if ( pp != p->pr_pptr )
  32.                     continue ;
  33.                 if ( lp = pp->pr_child )
  34.                 {       /* Does process have children ? */
  35.                     op = (struct process*)0 ;
  36.                     while (lp &&
  37.                     lp->pr_p.p_pid < p->pr_p.p_pid )
  38.                     {
  39.                         op = lp ;
  40.                         lp=lp->pr_sibling ;
  41.                     }
  42.                     if ( op )
  43.                     {
  44.                         p->pr_sibling = lp ;
  45.                         op->pr_sibling = p ;
  46.                         break ;
  47.                     }
  48.                 }       
  49.                 p->pr_sibling = lp ;
  50.                 pp->pr_child = p ;
  51.                 break ;
  52.             }
  53.             if ( pp )
  54.                 continue ;
  55.         }
  56.         /* We have a top level process, sort into top level list.
  57.            The top level is sorted firstly by user-id and then
  58.            by process-id. */
  59.         lp = &proot ;
  60.         pp = lp->pr_sibling ;
  61.         while ( pp )
  62.         {
  63.             if ( p->pr_p.p_uid < pp->pr_p.p_uid )
  64.                 break ;
  65.             if ( p->pr_p.p_uid == pp->pr_p.p_uid
  66.             && p->pr_p.p_pid < pp->pr_p.p_pid )
  67.                 break ;
  68.             lp = pp, pp = pp->pr_sibling ;
  69.         }
  70.         p->pr_sibling = lp->pr_sibling ;
  71.         lp->pr_sibling = p ;
  72.     }
  73.     return ( proot.pr_sibling ) ;
  74. }
  75.