| 320 |
|
if (rt == NULL) /* need to free up buffer? */ |
| 321 |
|
rt = raywait(rt0); |
| 322 |
|
if (rt == NULL) |
| 323 |
< |
error(SYSTEM, "raywait() returned NULL"); |
| 323 |
> |
error(SYSTEM, "raywait() returned NULL in raysamp()"); |
| 324 |
|
fp = rt->buf + 6*rt->nrays; |
| 325 |
|
*fp++ = org[0]; *fp++ = org[1]; *fp++ = org[2]; |
| 326 |
|
*fp++ = dir[0]; *fp++ = dir[1]; *fp = dir[2]; |
| 358 |
|
{ |
| 359 |
|
fd_set readset, errset; |
| 360 |
|
int nr; |
| 361 |
< |
struct rtproc *rt, *rtfree; |
| 361 |
> |
struct rtproc *rtfree; |
| 362 |
> |
register struct rtproc *rt; |
| 363 |
|
register int n; |
| 364 |
|
/* prepare select call */ |
| 365 |
|
FD_ZERO(&readset); FD_ZERO(&errset); n = 0; |
| 375 |
|
} |
| 376 |
|
if (!nr) /* no rays pending */ |
| 377 |
|
return(NULL); |
| 378 |
< |
if (nr > 1) /* call select for multiple processes */ |
| 379 |
< |
n = select(n, &readset, (fd_set *)NULL, &errset, |
| 380 |
< |
(struct timeval *)NULL); |
| 381 |
< |
else |
| 378 |
> |
if (nr > 1) { /* call select for multiple processes */ |
| 379 |
> |
errno = 0; |
| 380 |
> |
if (select(n, &readset, NULL, &errset, NULL) < 0) |
| 381 |
> |
error(SYSTEM, "select call error in raywait()"); |
| 382 |
> |
} else |
| 383 |
|
FD_ZERO(&errset); |
| 382 |
– |
if (n <= 0) |
| 383 |
– |
return(NULL); |
| 384 |
|
rtfree = NULL; /* read from ready process(es) */ |
| 385 |
|
for (rt = rt0; rt != NULL; rt = rt->next) { |
| 386 |
|
if (!FD_ISSET(rt->pd.r, &readset) && |
| 388 |
|
continue; |
| 389 |
|
for (n = 0; n < rt->bsiz && rt->dest[n] != NULL; n++) |
| 390 |
|
; |
| 391 |
< |
errno = 0; |
| 392 |
< |
nr = read(rt->pd.r, (char *)rt->buf, 3*sizeof(float)*(n+1)); |
| 393 |
< |
if (nr < 0) |
| 394 |
< |
error(SYSTEM, "read error in raywait()"); |
| 395 |
< |
if (nr == 0) /* unexpected EOF */ |
| 391 |
> |
nr = 3*sizeof(float)*(n+1); |
| 392 |
> |
if (readbuf(rt->pd.r, (char *)rt->buf, nr) < nr) |
| 393 |
|
error(USER, "rtrace process died"); |
| 397 |
– |
if (nr < 3*sizeof(float)*(n+1)) { /* read the rest */ |
| 398 |
– |
nr = readbuf(rt->pd.r, (char *)rt->buf, |
| 399 |
– |
3*sizeof(float)*(n+1) - nr); |
| 400 |
– |
if (nr < 0) |
| 401 |
– |
error(USER, "readbuf error in raywait()"); |
| 402 |
– |
} |
| 394 |
|
while (n-- > 0) { |
| 395 |
|
rt->dest[n][0] += rt->buf[3*n]; |
| 396 |
|
rt->dest[n][1] += rt->buf[3*n+1]; |