744 |
|
const SDCDst * |
745 |
|
SDgetTreCDist(const FVECT inVec, SDComponent *sdc) |
746 |
|
{ |
747 |
+ |
unsigned long cacheLeft = SDmaxCache; |
748 |
|
const SDTre *sdt; |
749 |
|
double inCoord[2]; |
750 |
|
int i; |
751 |
|
int mode; |
752 |
< |
SDTreCDst *cd, *cdlast; |
752 |
> |
SDTreCDst *cd, *cdlast, *cdlimit; |
753 |
|
/* check arguments */ |
754 |
|
if ((inVec == NULL) | (sdc == NULL) || |
755 |
|
(sdt = (SDTre *)sdc->dist) == NULL) |
789 |
|
/* quantize to avoid f.p. errors */ |
790 |
|
for (i = sdt->stc[tt_Y]->ndim - 2; i--; ) |
791 |
|
inCoord[i] = floor(inCoord[i]/quantum)*quantum + .5*quantum; |
792 |
< |
cdlast = NULL; /* check for direction in cache list */ |
792 |
> |
cdlast = cdlimit = NULL; /* check for direction in cache list */ |
793 |
|
/* PLACE MUTEX LOCK HERE FOR THREAD-SAFE */ |
794 |
|
for (cd = (SDTreCDst *)sdc->cdList; cd != NULL; |
795 |
|
cdlast = cd, cd = cd->next) { |
796 |
+ |
if (cacheLeft) { /* check cache size limit */ |
797 |
+ |
long csiz = sizeof(SDTreCDst) + |
798 |
+ |
sizeof(cd->carr[0])*cd->calen; |
799 |
+ |
if (cacheLeft > csiz) |
800 |
+ |
cacheLeft -= csiz; |
801 |
+ |
else { |
802 |
+ |
cdlimit = cdlast; |
803 |
+ |
cacheLeft = 0; |
804 |
+ |
} |
805 |
+ |
} |
806 |
|
if (cd->sidef != mode) |
807 |
|
continue; |
808 |
|
for (i = sdt->stc[tt_Y]->ndim - 2; i--; ) |
812 |
|
if (i < 0) |
813 |
|
break; /* means we have a match */ |
814 |
|
} |
815 |
< |
if (cd == NULL) /* need to create new entry? */ |
815 |
> |
if (cd == NULL) { /* need to create new entry? */ |
816 |
> |
if (cdlimit != NULL) /* exceeded cache size limit? */ |
817 |
> |
while ((cd = cdlimit->next) != NULL) { |
818 |
> |
cdlimit->next = cd->next; |
819 |
> |
free(cd); |
820 |
> |
} |
821 |
|
cdlast = cd = make_cdist(sdt, inCoord, mode != sdt->sidef); |
822 |
+ |
} |
823 |
|
if (cdlast != NULL) { /* move entry to head of cache list */ |
824 |
|
cdlast->next = cd->next; |
825 |
|
cd->next = (SDTreCDst *)sdc->cdList; |
1430 |
|
/* separate diffuse components */ |
1431 |
|
extract_diffuse(&sd->rLambFront, sd->rf); |
1432 |
|
extract_diffuse(&sd->rLambBack, sd->rb); |
1416 |
– |
if (sd->tf != NULL) |
1417 |
– |
extract_diffuse(&sd->tLamb, sd->tf); |
1433 |
|
if (sd->tb != NULL) |
1434 |
|
extract_diffuse(&sd->tLamb, sd->tb); |
1435 |
+ |
if (sd->tf != NULL) |
1436 |
+ |
extract_diffuse(&sd->tLamb, sd->tf); |
1437 |
|
/* return success */ |
1438 |
|
return SDEnone; |
1439 |
|
} |