ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/unix_process.c
(Generate patch)

Comparing ray/src/common/unix_process.c (file contents):
Revision 3.10 by greg, Thu Jun 14 05:13:25 2012 UTC vs.
Revision 3.11 by greg, Fri Mar 4 02:48:14 2016 UTC

# Line 28 | Line 28 | char   *av[]
28          char    *compath;
29          int     p0[2], p1[2];
30  
31 +        pd->pid = 0;
32          pd->running = 0;                /* not going yet */
33          
34          if (av == NULL)                 /* cloning operation? */
# Line 71 | Line 72 | char   *av[]
72   }
73  
74  
74
75   int
76 < close_process(          /* close pipes and wait for process */
77 < SUBPROC *pd
76 > close_processes(        /* close pipes and wait for processes to finish */
77 > SUBPROC pd[],
78 > int nproc
79   )
80   {
81 <        int     status;
81 >        int     togo = nproc;
82 >        int     status, rtn_status = 0;
83 >        RT_PID  pid;
84 >        int     i;
85  
86 <        if (!pd->running)
87 <                return(0);
88 <        close(pd->w);
89 <        close(pd->r);
90 <        pd->running = 0;
91 <        if (waitpid(pd->pid, &status, 0) == pd->pid)
86 >        for (i = 0; i < nproc; i++)             /* close pipes, first */
87 >                if (pd[i].running) {
88 >                        close(pd[i].w);
89 >                        close(pd[i].r);
90 >                        pd[i].running = 0;
91 >                }
92 >        if (nproc == 1) {                       /* await specific process? */
93 >                if (waitpid(pd->pid, &status, 0) != pd->pid)
94 >                        return(-1);
95 >                pd->pid = 0;
96                  return(status>>8 & 0xff);
97 <
98 <        return(-1);             /* ? unknown status */
97 >        }
98 >                                                /* else unordered wait */
99 >        while (togo > 0 && (pid = wait(&status)) >= 0) {
100 >                for (i = nproc; i-- > 0; )
101 >                        if (pd[i].pid == pid) {
102 >                                pd[i].pid = 0;
103 >                                --togo;
104 >                                break;
105 >                        }
106 >                if (i < 0)
107 >                        continue;               /* child we don't know? */
108 >                status = status>>8 & 0xff;
109 >                if (status)                     /* record non-zero status */
110 >                        rtn_status = status;
111 >        }
112 >        if (togo)                               /* child went missing? */
113 >                return(-1);
114 >        return(rtn_status);
115   }
92
93

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines