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.27 by greg, Sat Aug 20 06:05:53 2011 UTC vs.
Revision 2.31 by greg, Mon Apr 6 21:49:16 2020 UTC

# Line 147 | Line 147 | static const char      RCSid[] = "$Id$";
147   #include  "selcall.h"
148  
149   #ifndef RAYQLEN
150 < #define RAYQLEN         12              /* # rays to send at once */
150 > #define RAYQLEN         96              /* # rays to send at once */
151   #endif
152  
153   #ifndef MAX_RPROCS
# 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 176 | Line 176 | static int     r_send_next = 0;        /* next send ray placement
176   static int      r_recv_first = RAYQLEN; /* position of first unreported ray */
177   static int      r_recv_next = RAYQLEN;  /* next received ray placement */
178  
179 + static int      samplestep = 1;         /* sample step size */
180 +
181   #define sendq_full()    (r_send_next >= RAYQLEN)
182  
183   static int ray_pflush(void);
# Line 288 | Line 290 | ray_presult(           /* check for a completed ray */
290          static struct timeval   tpoll;  /* zero timeval struct */
291          static fd_set   readset, errset;
292          int     n, ok;
293 <        register int    pn;
293 >        int     pn;
294  
295          if (r == NULL)
296                  return(0);
# Line 366 | Line 368 | getready:                              /* any children waiting for us? */
368          }
369                                          /* preen returned rays */
370          for (n = r_recv_next - r_recv_first; n--; ) {
371 <                register RAY    *rp = &r_queue[r_recv_first + n];
371 >                RAY     *rp = &r_queue[r_recv_first + n];
372                  rp->rno = r_proc[pn].rno[n];
373                  rp->parent = NULL;
374                  rp->newcset = rp->clipset = NULL;
# Line 402 | Line 404 | ray_pchild(    /* process rays (never returns) */
404   )
405   {
406          int     n;
407 <        register int    i;
407 >        int     i;
408                                          /* flag child process for quit() */
409          ray_pnprocs = -1;
410                                          /* read each ray request set */
# Line 428 | Line 430 | ray_pchild(    /* process rays (never returns) */
430                          r_queue[i].clipset = NULL;
431                          r_queue[i].slights = NULL;
432                          r_queue[i].rlvl = 0;
433 <                        samplendx++;
433 >                        samplendx += samplestep;
434                          rayclear(&r_queue[i]);
435                          rayvalue(&r_queue[i]);
436                  }
# Line 462 | Line 464 | ray_popen(                     /* open the specified # processes */
464                  strcpy(shm_boundary, "SHM_BOUNDARY");
465          }
466          fflush(NULL);                   /* clear pending output */
467 +        samplestep = ray_pnprocs + nadd;
468          while (nadd--) {                /* fork each new process */
469                  int     p0[2], p1[2];
470                  if (pipe(p0) < 0 || pipe(p1) < 0)
# Line 480 | Line 483 | ray_popen(                     /* open the specified # processes */
483                  if (r_proc[ray_pnprocs].pid < 0)
484                          error(SYSTEM, "cannot fork child process");
485                  close(p1[0]); close(p0[1]);
486 <                if (rand_samp)          /* desynchronize random function */
487 <                        srandom((long)r_proc[ray_pnprocs].pid);
486 >                if (rand_samp)          /* decorrelate random sequence */
487 >                        srandom(random());
488 >                else
489 >                        samplendx++;
490                  /*
491                   * Close write stream on exec to avoid multiprocessing deadlock.
492                   * No use in read stream without it, so set flag there as well.
# Line 503 | 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 519 | 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