| 142 |
|
} |
| 143 |
|
if (!hp->dirty) /* check first */ |
| 144 |
|
return(0); |
| 145 |
+ |
errno = 0; |
| 146 |
|
if (lseek(hp->fd, biglob(hp)->fo, 0) < 0) |
| 147 |
|
error(SYSTEM, "cannot seek on holodeck file"); |
| 148 |
|
n = nbeams(hp)*sizeof(BEAMI); |
| 222 |
|
hp->bl[i]->tick = hdclock; /* preempt swap */ |
| 223 |
|
if (hdcachesize > 0 && hdmemuse(0) >= hdcachesize) |
| 224 |
|
hdfreecache(PCTFREE, NULL); /* free some space */ |
| 225 |
+ |
errno = 0; |
| 226 |
|
if (hp->bl[i] == NULL) { /* allocate (and load) */ |
| 227 |
|
n = hp->bi[i].nrd + nr; |
| 228 |
|
if ((hp->bl[i] = (BEAM *)malloc(hdbsiz(n))) == NULL) |
| 305 |
|
register struct fragment *f = hdfrag[hp->fd]; |
| 306 |
|
register int j, k; |
| 307 |
|
/* relinquish old fragment */ |
| 308 |
< |
if ((j = ++f->nfrags) >= MAXFRAG) |
| 309 |
< |
f->nfrags--; |
| 310 |
< |
for ( ; ; ) { /* stick it in our descending list */ |
| 311 |
< |
if (!--j || hp->bi[i].fo < f->fi[j-1].fo) { |
| 312 |
< |
f->fi[j].fo = hp->bi[i].fo; |
| 313 |
< |
f->fi[j].nrd = hp->bi[i].nrd; |
| 314 |
< |
break; |
| 308 |
> |
if (hp->bi[i].nrd) { |
| 309 |
> |
if ((j = ++f->nfrags) >= MAXFRAG) |
| 310 |
> |
f->nfrags--; |
| 311 |
> |
for ( ; ; ) { /* stick it in our descending list */ |
| 312 |
> |
if (!--j || hp->bi[i].fo < f->fi[j-1].fo) { |
| 313 |
> |
f->fi[j].fo = hp->bi[i].fo; |
| 314 |
> |
f->fi[j].nrd = hp->bi[i].nrd; |
| 315 |
> |
break; |
| 316 |
> |
} |
| 317 |
> |
copystruct(f->fi+j, f->fi+j-1); |
| 318 |
|
} |
| 314 |
– |
copystruct(f->fi+j, f->fi+j-1); |
| 315 |
– |
} |
| 319 |
|
/* coalesce adjacent fragments */ |
| 320 |
< |
for (j = k = 0; k < f->nfrags; j++, k++) { |
| 321 |
< |
if (j != k) |
| 322 |
< |
copystruct(f->fi+j, f->fi+k); |
| 323 |
< |
while (k+1 < f->nfrags && |
| 324 |
< |
f->fi[k+1].fo + f->fi[k+1].nrd*sizeof(RAYVAL) == |
| 325 |
< |
f->fi[j].fo) |
| 326 |
< |
f->fi[j].fo -= f->fi[++k].nrd*sizeof(RAYVAL); |
| 320 |
> |
for (j = k = 0; k < f->nfrags; j++, k++) { |
| 321 |
> |
if (k > j) |
| 322 |
> |
copystruct(f->fi+j, f->fi+k); |
| 323 |
> |
while (k+1 < f->nfrags && f->fi[k+1].fo + |
| 324 |
> |
f->fi[k+1].nrd*sizeof(RAYVAL) |
| 325 |
> |
== f->fi[j].fo) { |
| 326 |
> |
f->fi[j].fo -= |
| 327 |
> |
f->fi[++k].nrd*sizeof(RAYVAL); |
| 328 |
> |
f->fi[j].nrd += f->fi[k].nrd; |
| 329 |
> |
} |
| 330 |
> |
} |
| 331 |
> |
f->nfrags = j; |
| 332 |
|
} |
| 325 |
– |
f->nfrags = j; |
| 333 |
|
k = -1; /* find closest-sized fragment */ |
| 334 |
|
for (j = f->nfrags; j-- > 0; ) |
| 335 |
|
if (f->fi[j].nrd >= nrays && |
| 336 |
< |
(k < 0 || f->fi[j].nrd < f->fi[k].nrd) |
| 337 |
< |
&& f->fi[k=j].nrd == nrays) |
| 338 |
< |
break; |
| 336 |
> |
(k < 0 || f->fi[j].nrd < f->fi[k].nrd)) |
| 337 |
> |
if (f->fi[k=j].nrd == nrays) |
| 338 |
> |
break; |
| 339 |
|
if (k < 0) { /* no fragment -- extend file */ |
| 340 |
|
hp->bi[i].fo = f->flen; |
| 341 |
|
f->flen += nrays*sizeof(RAYVAL); |