--- ray/src/rt/data.c 1992/11/22 10:02:57 2.5 +++ ray/src/rt/data.c 1993/02/08 13:12:28 2.7 @@ -1,4 +1,4 @@ -/* Copyright (c) 1992 Regents of the University of California */ +/* Copyright (c) 1993 Regents of the University of California */ #ifndef lint static char SCCSid[] = "$SunId$ LBL"; @@ -18,14 +18,29 @@ static char SCCSid[] = "$SunId$ LBL"; #include "data.h" + /* picture memory usage before warning */ +#ifndef PSIZWARN +#ifdef BIGMEM +#define PSIZWARN 3000000 +#else +#define PSIZWARN 1000000 +#endif +#endif +#ifndef TABSIZ +#define TABSIZ 97 /* table size (prime) */ +#endif + +#define hash(s) (shash(s)%TABSIZ) + + extern char *fgetword(); extern char *libpath; /* library search path */ -static DATARRAY *dlist = NULL; /* data array list */ +static DATARRAY *dtab[TABSIZ]; /* data array list */ -static DATARRAY *plist = NULL; /* picture list */ +static DATARRAY *ptab[TABSIZ]; /* picture list */ DATARRAY * @@ -39,7 +54,7 @@ char *dname; register int i, j; register DATARRAY *dp; /* look for array in list */ - for (dp = dlist; dp != NULL; dp = dp->next) + for (dp = dtab[hash(dname)]; dp != NULL; dp = dp->next) if (!strcmp(dname, dp->name)) return(dp); /* found! */ @@ -127,8 +142,9 @@ char *dname; dp->arr[i] = atof(word); } fclose(fp); - dp->next = dlist; - return(dlist = dp); + i = hash(dname); + dp->next = dtab[i]; + return(dtab[i] = dp); memerr: error(SYSTEM, "out of memory in getdata"); @@ -165,7 +181,7 @@ char *pname; register int x, i; register DATARRAY *pp; /* look for array in list */ - for (pp = plist; pp != NULL; pp = pp->next) + for (pp = ptab[hash(pname)]; pp != NULL; pp = pp->next) if (!strcmp(pname, pp->name)) return(pp); /* found! */ @@ -192,6 +208,15 @@ char *pname; getheader(fp, headaspect, &inpaspect); if (!fgetsresolu(&inpres, fp)) goto readerr; +#if PSIZWARN + /* check memory usage */ + i = 3*sizeof(DATATYPE)*inpres.xr*inpres.yr; + if (i > PSIZWARN) { + sprintf(errmsg, "picture file \"%s\" using %d bytes of memory", + pname, i); + error(WARNING, errmsg); + } +#endif for (i = 0; i < 3; i++) { pp[i].nd = 2; pp[i].dim[0].ne = inpres.yr; @@ -232,10 +257,11 @@ char *pname; } free((char *)scanin); fclose(fp); + i = hash(pname); pp[0].next = pp[1].next = - pp[2].next = plist; - return(plist = pp); + pp[2].next = ptab[i]; + return(ptab[i] = pp); memerr: error(SYSTEM, "out of memory in getpict"); @@ -249,23 +275,31 @@ freedata(dname) /* free memory associated with dname char *dname; { DATARRAY head; + int hval, nents; register DATARRAY *dp, *dpl; register int i; - head.next = dlist; - dpl = &head; - while ((dp = dpl->next) != NULL) - if (dname == NULL || !strcmp(dname, dp->name)) { - dpl->next = dp->next; - free((char *)dp->arr); - for (i = 0; i < dp->nd; i++) - if (dp->dim[i].p != NULL) - free((char *)dp->dim[i].p); - freestr(dp->name); - free((char *)dp); - } else - dpl = dp; - dlist = head.next; + if (dname == NULL) { /* free all if NULL */ + hval = 0; nents = TABSIZ; + } else { + hval = hash(dname); nents = 1; + } + while (nents--) { + head.next = dtab[hval]; + dpl = &head; + while ((dp = dpl->next) != NULL) + if (dname == NULL || !strcmp(dname, dp->name)) { + dpl->next = dp->next; + free((char *)dp->arr); + for (i = 0; i < dp->nd; i++) + if (dp->dim[i].p != NULL) + free((char *)dp->dim[i].p); + freestr(dp->name); + free((char *)dp); + } else + dpl = dp; + dtab[hval++] = head.next; + } } @@ -273,21 +307,29 @@ freepict(pname) /* free memory associated with pname char *pname; { DATARRAY head; + int hval, nents; register DATARRAY *pp, *ppl; - head.next = plist; - ppl = &head; - while ((pp = ppl->next) != NULL) - if (pname == NULL || !strcmp(pname, pp->name)) { - ppl->next = pp->next; - free((char *)pp[0].arr); - free((char *)pp[1].arr); - free((char *)pp[2].arr); - freestr(pp[0].name); - free((char *)pp); - } else - ppl = pp; - plist = head.next; + if (pname == NULL) { /* free all if NULL */ + hval = 0; nents = TABSIZ; + } else { + hval = hash(pname); nents = 1; + } + while (nents--) { + head.next = ptab[hval]; + ppl = &head; + while ((pp = ppl->next) != NULL) + if (pname == NULL || !strcmp(pname, pp->name)) { + ppl->next = pp->next; + free((char *)pp[0].arr); + free((char *)pp[1].arr); + free((char *)pp[2].arr); + freestr(pp[0].name); + free((char *)pp); + } else + ppl = pp; + ptab[hval++] = head.next; + } }