--- ray/src/hd/holofile.c 1999/01/07 22:04:49 3.32 +++ ray/src/hd/holofile.c 1999/01/25 09:58:41 3.35 @@ -13,8 +13,12 @@ static char SCCSid[] = "$SunId$ SGI"; #include "holo.h" #ifndef CACHESIZE -#define CACHESIZE 16 /* default cache size (Mbytes, 0==inf) */ +#ifdef BIGMEM +#define CACHESIZE 32 /* default cache size (Mbytes, 0==inf) */ +#else +#define CACHESIZE 12 #endif +#endif #ifndef FREEBEAMS #define FREEBEAMS 1500 /* maximum beams to free at a time */ #endif @@ -483,6 +487,7 @@ int (*bf)(); /* callback function (optional) */ } +int hdfreefrag(hp, i) /* free a file fragment */ HOLO *hp; int i; @@ -492,7 +497,7 @@ int i; register int j, k; if (bi->nrd <= 0) - return; + return(0); DCHECK(hp->fd < 0 | hp->fd >= nhdfragls || !hdfragl[hp->fd].nlinks, CONSISTENCY, "bad file descriptor in hdfreefrag"); f = &hdfragl[hp->fd]; @@ -512,7 +517,7 @@ int i; if (j >= MAXFRAGB*FRAGBLK) { f->nfrags = j--; /* stop list growth */ if (bi->nrd <= f->fi[j].nrd) - return; /* new one no better than discard */ + return(0); /* new one no better than discard */ } #endif if (j % FRAGBLK == 0) { /* more (or less) free list space */ @@ -524,7 +529,7 @@ int i; (j+FRAGBLK)*sizeof(BEAMI)); if (newp == NULL) { f->nfrags--; /* graceful failure */ - return; + return(0); } f->fi = newp; } @@ -553,7 +558,8 @@ int i; } biglob(hp)->nrd -= bi->nrd; /* tell fragment it's free */ bi->nrd = 0; - bi->fo = 0; + bi->fo = 0L; + return(1); } @@ -587,7 +593,7 @@ int fd; unsigned int4 nrays; { register struct fraglist *f; - register int j, k; + register int j; long nfo; if (nrays == 0) @@ -595,19 +601,16 @@ unsigned int4 nrays; DCHECK(fd < 0 | fd >= nhdfragls || !hdfragl[fd].nlinks, CONSISTENCY, "bad file descriptor in hdallocfrag"); f = &hdfragl[fd]; - 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)) - if (f->fi[k=j].nrd == nrays) - break; - if (k < 0) { /* no fragment -- extend file */ + for (j = f->nfrags; j-- > 0; ) /* first fit algorithm */ + if (f->fi[j].nrd >= nrays) + break; + if (j < 0) { /* no fragment -- extend file */ nfo = f->flen; f->flen += nrays*sizeof(RAYVAL); } else { /* else use fragment */ - nfo = f->fi[k].fo; - f->fi[k].fo += nrays*sizeof(RAYVAL); - f->fi[k].nrd -= nrays; + nfo = f->fi[j].fo; + f->fi[j].fo += nrays*sizeof(RAYVAL); + f->fi[j].nrd -= nrays; } return(nfo); } @@ -645,7 +648,8 @@ register int i; hp->bi[i].fo = nfo; } else hp->bi[i].fo = 0L; - biglob(hp)->nrd += hp->bi[i].nrd = nrays; + biglob(hp)->nrd += nrays - hp->bi[i].nrd; + hp->bi[i].nrd = nrays; markdirty(hp, i); /* section directory now out of date */ return(1); } @@ -720,6 +724,7 @@ register int i; if (hp->bi[i].nrd) { if (hdfragflags&FF_KILL) hdfreefrag(hp, i); + biglob(hp)->nrd -= hp->bi[i].nrd; hp->bi[i].nrd = 0; /* make sure it's gone */ hp->bi[i].fo = 0L; }