468 |
|
if (r_proc[ray_pnprocs].pid < 0) |
469 |
|
error(SYSTEM, "cannot fork child process"); |
470 |
|
close(p1[0]); close(p0[1]); |
471 |
+ |
/* |
472 |
+ |
* Close write stream on exec to avoid multiprocessing deadlock. |
473 |
+ |
* No use in read stream without it, so set flag there as well. |
474 |
+ |
*/ |
475 |
+ |
fcntl(p1[1], F_SETFD, FD_CLOEXEC); |
476 |
+ |
fcntl(p0[0], F_SETFD, FD_CLOEXEC); |
477 |
|
r_proc[ray_pnprocs].fd_send = p1[1]; |
478 |
|
r_proc[ray_pnprocs].fd_recv = p0[0]; |
479 |
|
r_proc[ray_pnprocs].npending = 0; |
506 |
|
ray_pnprocs--; |
507 |
|
close(r_proc[ray_pnprocs].fd_recv); |
508 |
|
close(r_proc[ray_pnprocs].fd_send); |
509 |
< |
while (wait(&status) != r_proc[ray_pnprocs].pid) |
510 |
< |
; |
509 |
> |
if (waitpid(r_proc[ray_pnprocs].pid, &status, 0) < 0) |
510 |
> |
status = 127<<8; |
511 |
|
if (status) { |
512 |
|
sprintf(errmsg, |
513 |
|
"rendering process %d exited with code %d", |