9 |
|
Need to refactor code by forking a subprocess for each |
10 |
|
rtrace call to take output and accumulate it into bins |
11 |
|
for the parent process. This will avoid our current |
12 |
< |
bottleneck around processing output queues, computing |
13 |
< |
bins and the associated buffer growth, which can be crazy |
14 |
< |
(gigabytes/subprocess). Each child process will return |
12 |
> |
bottleneck around processing output queues. We'll sum into |
13 |
> |
bins and avoid the associated buffer growth, which can be crazy |
14 |
> |
now (gigabytes/subprocess). Each child process will return |
15 |
|
a ray number and a fully computed and ready-to-output |
16 |
< |
record of modifiers and their summed bins. These will |
17 |
< |
be queued and sorted by the parent for ordered output. |
16 |
> |
record of modifiers and their bin totals. These will |
17 |
> |
be queued and sorted by the parent for ordered output or |
18 |
> |
accumulated for all rays if -c 0 is in play. |
19 |
|
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX*/ |
20 |
|
|
21 |
|
#include "standard.h" |
37 |
|
#define MAXMODLIST 1024 /* maximum modifiers we'll track */ |
38 |
|
#endif |
39 |
|
|
40 |
+ |
#ifndef RNUMBER |
41 |
+ |
#define RNUMBER unsigned long /* ray counter (>= sizeof pointer) */ |
42 |
+ |
#endif |
43 |
+ |
|
44 |
|
ssize_t treebufsiz = BUFSIZ; /* current tree buffer size */ |
45 |
|
|
46 |
|
typedef double DCOLOR[3]; /* double-precision color */ |
112 |
|
struct rtproc { |
113 |
|
struct rtproc *next; /* next in list of processes */ |
114 |
|
SUBPROC pd; /* rtrace pipe descriptors */ |
115 |
< |
unsigned long raynum; /* ray number for this tree */ |
115 |
> |
RNUMBER raynum; /* ray number for this tree */ |
116 |
|
size_t bsiz; /* ray tree buffer length */ |
117 |
|
char *buf; /* ray tree buffer */ |
118 |
|
size_t nbr; /* number of bytes from rtrace */ |
159 |
|
int yres = 0; /* vert. output resolution */ |
160 |
|
|
161 |
|
int account; /* current accumulation count */ |
162 |
< |
unsigned long raysleft; /* number of rays left to trace */ |
162 |
> |
RNUMBER raysleft; /* number of rays left to trace */ |
163 |
|
long waitflush; /* how long until next flush */ |
164 |
|
|
165 |
< |
unsigned long lastray = 0; /* last ray number sent */ |
166 |
< |
unsigned long lastdone = 0; /* last ray processed */ |
165 |
> |
RNUMBER lastray = 0; /* last ray number sent */ |
166 |
> |
RNUMBER lastdone = 0; /* last ray processed */ |
167 |
|
|
168 |
|
int using_stdout = 0; /* are we using stdout? */ |
169 |
|
|
596 |
|
rtp->next = NULL; /* terminate list */ |
597 |
|
if (yres > 0) { |
598 |
|
if (xres > 0) |
599 |
< |
raysleft = (unsigned long)xres*yres; |
599 |
> |
raysleft = (RNUMBER)xres*yres; |
600 |
|
else |
601 |
|
raysleft = yres; |
602 |
|
} else |
1571 |
|
for (nvals = 0; nvals < lastout; nvals++) |
1572 |
|
if (getinp(oname, fin) < 0) |
1573 |
|
error(USER, "unexpected EOF on input"); |
1574 |
< |
lastray = lastdone = (unsigned long)lastout * accumulate; |
1574 |
> |
lastray = lastdone = (RNUMBER)lastout * accumulate; |
1575 |
|
if (raysleft) |
1576 |
|
raysleft -= lastray; |
1577 |
|
} |