| 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", |