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

Comparing ray/src/rt/rc3.c (file contents):
Revision 2.8 by greg, Tue Jun 12 22:46:45 2012 UTC vs.
Revision 2.9 by greg, Thu Jun 14 05:13:25 2012 UTC

# Line 274 | Line 274 | set_stdout(const LUENT *le, void *p)
274   int
275   in_rchild()
276   {
277 < #ifdef _WIN32
278 <        error(WARNING, "multiprocessing unsupported -- running solo");
279 <        nproc = 1;
280 <        return(1);
281 < #else
282 <                                        /* try to fork ourselves */
283 <        while (nchild < nproc) {
284 <                int     p0[2], p1[2];
285 <                int     pid;
286 <                                        /* prepare i/o pipes */
277 >        int     rval;
278 >
279 >        while (nchild < nproc) {        /* fork until target reached */
280                  errno = 0;
281 <                if (pipe(p0) < 0 || pipe(p1) < 0)
282 <                        error(SYSTEM, "pipe() call failed!");
283 <                pid = fork();           /* fork parent process */
284 <                if (pid == 0) {         /* if in child, set up & return true */
292 <                        close(p0[1]); close(p1[0]);
281 >                rval = open_process(&kida[nchild].pr, NULL);
282 >                if (rval < 0)
283 >                        error(SYSTEM, "open_process() call failed");
284 >                if (rval == 0) {        /* if in child, set up & return true */
285                          lu_doall(&modconttab, set_stdout, NULL);
286                          lu_done(&ofiletab);
287                          while (nchild--) {      /* don't share other pipes */
288                                  close(kida[nchild].pr.w);
289                                  fclose(kida[nchild].infp);
290                          }
299                        dup2(p0[0], 0); close(p0[0]);
300                        dup2(p1[1], 1); close(p1[1]);
291                          inpfmt = (sizeof(RREAL)==sizeof(double)) ? 'd' : 'f';
292                          outfmt = 'd';
293                          header = 0;
# Line 310 | Line 300 | in_rchild()
300                                  waitflush = xres = 0;
301                                  account = accumulate = 0;
302                          }
303 <                        return(1);      /* child return value */
303 >                        return(1);      /* return "true" in child */
304                  }
305 <                if (pid < 0)
306 <                        error(SYSTEM, "fork() call failed!");
307 <                                        /* connect parent's pipes */
308 <                close(p0[0]); close(p1[1]);
319 <                kida[nchild].pr.r = p1[0];
320 <                kida[nchild].pr.w = p0[1];
321 <                kida[nchild].pr.pid = pid;
322 <                kida[nchild].pr.running = 1;
323 <                kida[nchild].infp = fdopen(p1[0], "rb");
305 >                if (rval != PIPE_BUF)
306 >                        error(CONSISTENCY, "bad value from open_process()");
307 >                                        /* connect to child's output */
308 >                kida[nchild].infp = fdopen(kida[nchild].pr.r, "rb");
309                  if (kida[nchild].infp == NULL)
310                          error(SYSTEM, "out of memory in in_rchild()");
311   #ifdef getc_unlocked
# Line 328 | Line 313 | in_rchild()
313   #endif
314                  kida[nchild++].nr = 0;  /* mark as available */
315          }
316 <        return(0);                      /* parent return value */
332 < #endif
316 >        return(0);                      /* return "false" in parent */
317   }
318  
319  
# Line 341 | Line 325 | end_children()
325          
326          while (nchild > 0) {
327                  nchild--;
344                fclose(kida[nchild].infp);      
345                kida[nchild].pr.r = -1;         /* close(-1) error is ignored */
328                  if ((status = close_process(&kida[nchild].pr)) > 0) {
329                          sprintf(errmsg,
330                                  "rendering process returned bad status (%d)",
331                                          status);
332                          error(WARNING, errmsg);
333                  }
334 +                fclose(kida[nchild].infp);
335          }
336   }
337  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines