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

Comparing ray/src/rt/raypcalls.c (file contents):
Revision 2.28 by greg, Sat Aug 20 18:23:38 2011 UTC vs.
Revision 2.29 by greg, Fri Mar 4 02:48:14 2016 UTC

# Line 164 | Line 164 | int            ray_pnprocs = 0;        /* number of child processes */
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 */
# Line 508 | Line 508 | ray_pclose(            /* close one or more child processes */
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;
# Line 524 | Line 525 | ray_pclose(            /* close one or more child processes */
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   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines