home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume3 / sps / part2 / mktree.c < prev    next >
Encoding:
C/C++ Source or Header  |  1986-11-30  |  1.6 KB  |  71 lines

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