--- ray/src/hd/holofile.c 1997/10/31 10:23:29 3.1 +++ ray/src/hd/holofile.c 1997/11/03 13:40:22 3.3 @@ -142,6 +142,7 @@ register HOLO *hp; } if (!hp->dirty) /* check first */ return(0); + errno = 0; if (lseek(hp->fd, biglob(hp)->fo, 0) < 0) error(SYSTEM, "cannot seek on holodeck file"); n = nbeams(hp)*sizeof(BEAMI); @@ -221,6 +222,7 @@ int nr; /* number of new rays desired */ hp->bl[i]->tick = hdclock; /* preempt swap */ if (hdcachesize > 0 && hdmemuse(0) >= hdcachesize) hdfreecache(PCTFREE, NULL); /* free some space */ + errno = 0; if (hp->bl[i] == NULL) { /* allocate (and load) */ n = hp->bi[i].nrd + nr; if ((hp->bl[i] = (BEAM *)malloc(hdbsiz(n))) == NULL) @@ -303,32 +305,37 @@ register int i; register struct fragment *f = hdfrag[hp->fd]; register int j, k; /* relinquish old fragment */ - if ((j = ++f->nfrags) >= MAXFRAG) - f->nfrags--; - for ( ; ; ) { /* stick it in our descending list */ - if (!--j || hp->bi[i].fo < f->fi[j-1].fo) { - f->fi[j].fo = hp->bi[i].fo; - f->fi[j].nrd = hp->bi[i].nrd; - break; + if (hp->bi[i].nrd) { + if ((j = ++f->nfrags) >= MAXFRAG) + f->nfrags--; + for ( ; ; ) { /* stick it in our descending list */ + if (!--j || hp->bi[i].fo < f->fi[j-1].fo) { + f->fi[j].fo = hp->bi[i].fo; + f->fi[j].nrd = hp->bi[i].nrd; + break; + } + copystruct(f->fi+j, f->fi+j-1); } - copystruct(f->fi+j, f->fi+j-1); - } /* coalesce adjacent fragments */ - for (j = k = 0; k < f->nfrags; j++, k++) { - if (j != k) - copystruct(f->fi+j, f->fi+k); - while (k+1 < f->nfrags && - f->fi[k+1].fo + f->fi[k+1].nrd*sizeof(RAYVAL) == - f->fi[j].fo) - f->fi[j].fo -= f->fi[++k].nrd*sizeof(RAYVAL); + for (j = k = 0; k < f->nfrags; j++, k++) { + if (k > j) + copystruct(f->fi+j, f->fi+k); + while (k+1 < f->nfrags && f->fi[k+1].fo + + f->fi[k+1].nrd*sizeof(RAYVAL) + == f->fi[j].fo) { + f->fi[j].fo -= + f->fi[++k].nrd*sizeof(RAYVAL); + f->fi[j].nrd += f->fi[k].nrd; + } + } + f->nfrags = j; } - f->nfrags = j; k = -1; /* find closest-sized fragment */ for (j = f->nfrags; j-- > 0; ) if (f->fi[j].nrd >= nrays && - (k < 0 || f->fi[j].nrd < f->fi[k].nrd) - && f->fi[k=j].nrd == nrays) - break; + (k < 0 || f->fi[j].nrd < f->fi[k].nrd)) + if (f->fi[k=j].nrd == nrays) + break; if (k < 0) { /* no fragment -- extend file */ hp->bi[i].fo = f->flen; f->flen += nrays*sizeof(RAYVAL);