185 |
|
|
186 |
|
ray_init(otnm); /* load the shared scene */ |
187 |
|
|
188 |
– |
preload_objs(); /* preload auxiliary data */ |
189 |
– |
|
190 |
– |
/* set shared memory boundary */ |
191 |
– |
shm_boundary = (char *)malloc(16); |
192 |
– |
strcpy(shm_boundary, "SHM_BOUNDARY"); |
193 |
– |
|
188 |
|
r_send_next = 0; /* set up queue */ |
189 |
|
r_recv_first = r_recv_next = RAYQLEN; |
190 |
|
|
251 |
|
return(0); |
252 |
|
/* check for full send queue */ |
253 |
|
if (sendq_full()) { |
254 |
< |
RAY mySend; |
261 |
< |
int rval; |
262 |
< |
mySend = *r; |
254 |
> |
RAY mySend = *r; |
255 |
|
/* wait for a result */ |
256 |
< |
rval = ray_presult(r, 0); |
256 |
> |
if (ray_presult(r, 0) <= 0) |
257 |
> |
return(-1); |
258 |
|
/* put new ray in queue */ |
259 |
|
r_queue[r_send_next++] = mySend; |
260 |
< |
return(rval); /* done */ |
260 |
> |
/* XXX r_send_next may now be > RAYQLEN */ |
261 |
> |
return(1); |
262 |
|
} |
263 |
|
/* else add ray to send queue */ |
264 |
|
r_queue[r_send_next++] = *r; |
287 |
|
/* check queued results first */ |
288 |
|
if (r_recv_first < r_recv_next) { |
289 |
|
*r = r_queue[r_recv_first++]; |
296 |
– |
/* make sure send queue has room */ |
297 |
– |
if (sendq_full() && ray_pflush() <= 0) |
298 |
– |
return(-1); |
290 |
|
return(1); |
291 |
|
} |
292 |
|
n = ray_pnprocs - ray_pnidle; /* pending before flush? */ |
442 |
|
if (nadd <= 0) |
443 |
|
return; |
444 |
|
ambsync(); /* load any new ambient values */ |
445 |
+ |
if (shm_boundary == NULL) { /* first child process? */ |
446 |
+ |
preload_objs(); /* preload auxiliary data */ |
447 |
+ |
/* set shared memory boundary */ |
448 |
+ |
shm_boundary = (char *)malloc(16); |
449 |
+ |
strcpy(shm_boundary, "SHM_BOUNDARY"); |
450 |
+ |
} |
451 |
|
fflush(NULL); /* clear pending output */ |
452 |
|
while (nadd--) { /* fork each new process */ |
453 |
|
int p0[2], p1[2]; |