home *** CD-ROM | disk | FTP | other *** search
/ gdead.berkeley.edu / gdead.berkeley.edu.tar / gdead.berkeley.edu / pub / cad-tools / ciftomann.tar / driver_dir / pwait.c < prev    next >
C/C++ Source or Header  |  1988-01-28  |  2KB  |  85 lines

  1. /*
  2.  * Wait for a process the right way.  We wait for a particular
  3.  * process and if any others come along in between, we remember them
  4.  * in case they are eventually waited for.
  5.  *
  6.  * This routine is not very efficient when the number of processes
  7.  * to be remembered is large.
  8.  */
  9.  
  10. char *malloc();
  11.  
  12. #include <stdio.h>
  13. #define nil(type) ( (type) 0)
  14. #define alloc(num,type) ( (type *) malloc(num*sizeof(type)))
  15. #define dispose(ptr) free( (char *) ptr)
  16.  
  17. #define LOCAL static
  18.  
  19. typedef struct pidlist {
  20.     int pid;
  21.     int status;
  22.     struct pidlist *next;
  23. } PIDLIST;
  24.  
  25. LOCAL PIDLIST *pidlist, *pfind();
  26.  
  27. pwait(pid, statusp)
  28. int pid, *statusp;
  29. {
  30.     PIDLIST *p;
  31.     int pnum, status;
  32.  
  33.     p = pfind(pid);
  34.     if (p != nil(PIDLIST *)) {
  35.         *statusp = p->status;
  36.         dispose(p);
  37.         return;
  38.     }
  39.     while ((pnum = wait(&status)) != pid && pnum >= 0) {
  40.         p = alloc(1, PIDLIST);
  41.         p->pid = pnum;
  42.         p->status = status;
  43.         p->next = pidlist;
  44.         pidlist = p;
  45.     }
  46.     if (pnum < 0) {
  47.         p = pfind(pid);
  48.         if (p == nil(PIDLIST *)) {
  49.             panic("pwait: pid %d not found", pid);
  50.         }
  51.         *statusp = p->status;
  52.         dispose(p);
  53.     } else {
  54.         *statusp = status;
  55.     }
  56. }
  57.  
  58. /*
  59.  * Look for the given process id on the pidlist.
  60.  *
  61.  * Unlink it from list if found.
  62.  */
  63.  
  64. LOCAL PIDLIST *pfind(pid)
  65. int pid;
  66. {
  67.     register PIDLIST *p, *prev;
  68.  
  69.     prev = nil(PIDLIST *);
  70.     for (p = pidlist; p != nil(PIDLIST *); p = p->next) {
  71.         if (p->pid == pid) {
  72.             break;
  73.         }
  74.         prev = p;
  75.     }
  76.     if (p != nil(PIDLIST *)) {
  77.         if (prev == nil(PIDLIST *)) {
  78.             pidlist = p->next;
  79.         } else {
  80.             prev->next = p->next;
  81.         }
  82.     }
  83.     return(p);
  84. }
  85.