164 |
|
int ray_pnidle = 0; /* number of idle children */ |
165 |
|
|
166 |
|
static struct child_proc { |
167 |
< |
int pid; /* child process id */ |
167 |
> |
RT_PID pid; /* child process id */ |
168 |
|
int fd_send; /* write to child here */ |
169 |
|
int fd_recv; /* read from child here */ |
170 |
|
int npending; /* # rays in process */ |
508 |
|
) |
509 |
|
{ |
510 |
|
static int inclose = 0; |
511 |
< |
RAY res; |
511 |
> |
RAY res; |
512 |
> |
int i, status = 0; |
513 |
|
/* check recursion */ |
514 |
|
if (inclose) |
515 |
|
return; |
525 |
|
; |
526 |
|
r_send_next = 0; /* hard reset in case of error */ |
527 |
|
r_recv_first = r_recv_next = RAYQLEN; |
528 |
< |
/* clean up children */ |
529 |
< |
while (nsub--) { |
530 |
< |
int status; |
531 |
< |
ray_pnprocs--; |
532 |
< |
close(r_proc[ray_pnprocs].fd_send); |
533 |
< |
if (waitpid(r_proc[ray_pnprocs].pid, &status, 0) < 0) |
528 |
> |
/* close send pipes */ |
529 |
> |
for (i = ray_pnprocs-nsub; i < ray_pnprocs; i++) |
530 |
> |
close(r_proc[i].fd_send); |
531 |
> |
|
532 |
> |
if (nsub == 1) { /* awaiting single process? */ |
533 |
> |
if (waitpid(r_proc[ray_pnprocs-1].pid, &status, 0) < 0) |
534 |
|
status = 127<<8; |
535 |
< |
close(r_proc[ray_pnprocs].fd_recv); |
536 |
< |
if (status) { |
537 |
< |
sprintf(errmsg, |
538 |
< |
"rendering process %d exited with code %d", |
539 |
< |
r_proc[ray_pnprocs].pid, status>>8); |
540 |
< |
error(WARNING, errmsg); |
535 |
> |
close(r_proc[ray_pnprocs-1].fd_recv); |
536 |
> |
} else /* else unordered wait */ |
537 |
> |
for (i = 0; i < nsub; ) { |
538 |
> |
int j, mystatus; |
539 |
> |
RT_PID pid = wait(&mystatus); |
540 |
> |
for (j = ray_pnprocs-nsub; j < ray_pnprocs; j++) |
541 |
> |
if (r_proc[j].pid == pid) { |
542 |
> |
if (mystatus) |
543 |
> |
status = mystatus; |
544 |
> |
close(r_proc[j].fd_recv); |
545 |
> |
++i; |
546 |
> |
} |
547 |
|
} |
548 |
< |
ray_pnidle--; |
548 |
> |
ray_pnprocs -= nsub; |
549 |
> |
ray_pnidle -= nsub; |
550 |
> |
if (status) { |
551 |
> |
sprintf(errmsg, "rendering process exited with code %d", status>>8); |
552 |
> |
error(WARNING, errmsg); |
553 |
|
} |
554 |
|
inclose--; |
555 |
|
} |