ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/src/common/modobject.c
(Generate patch)

Comparing src/common/modobject.c (file contents):
Revision 2.21 by greg, Fri Dec 6 20:30:15 2024 UTC vs.
Revision 2.25 by greg, Sat Jun 21 17:42:17 2025 UTC

# Line 10 | Line 10 | static const char RCSid[] = "$Id$";
10   #include "copyright.h"
11  
12   #include  "standard.h"
13
13   #include  "object.h"
15
14   #include  "otypes.h"
15  
16  
17   static struct ohtab {
18 <        int  hsiz;                      /* current table size */
19 <        OBJECT  *htab;                  /* table, if allocated */
18 >        int     hsiz;                   /* current table size */
19 >        OBJECT  *htab;                  /* table, if allocated */
20   }  modtab = {100, NULL}, objtab = {1000, NULL}; /* modifiers and objects */
21  
22   static int  otndx(char *, struct ohtab *);
# Line 29 | Line 27 | objndx(                                /* get object number from pointer */
27          OBJREC  *op
28   )
29   {
30 <        int     i;
31 <        ssize_t j;
32 <
33 <        for (i = (nobjects-1)>>OBJBLKSHFT; i >= 0; i--) {
34 <                j = op - objblock[i];
35 <                if ((0 <= j) & (j < OBJBLKSIZ))
36 <                        return(((OBJECT)i<<OBJBLKSHFT) + (OBJECT)j);
37 <        }
30 > #ifndef ONCACHESIZ
31 > #define ONCACHESIZ      907     /* keep a cache of previous searches */
32 > #endif
33 >        static OBJECT   oncache[ONCACHESIZ];
34 >        const int       ent = (size_t)op % ONCACHESIZ;
35 >        int             i;
36 >                                /* clear cache on first call */
37 >        for (i = ONCACHESIZ*(!oncache[0] & !oncache[1]); i--; )
38 >                oncache[i] = OVOID;
39 >                                /* is this pointer in cache? */
40 >        if ((oncache[ent] != OVOID) & (oncache[ent] < nobjects) &&
41 >                                objptr(oncache[ent]) == op)
42 >                return(oncache[ent]);           /* matches previous search */
43 >                                /* else look for allocated block */
44 >        for (i = (nobjects-1)>>OBJBLKSHFT; i >= 0; i--)
45 >                if ((objblock[i] <= op) & (op < objblock[i]+OBJBLKSIZ)) {
46 >                                /* found it -- save index to cache */
47 >                        oncache[ent] = ((OBJECT)i << OBJBLKSHFT) +
48 >                                                (op - objblock[i]);
49 >                        return(oncache[ent]);
50 >                }
51          return(OVOID);          /* not in our array -- may still be valid */
52   }
53  
# Line 48 | Line 59 | lastmod(                       /* find modifier definition before obj */
59   )
60   {
61          OBJREC  *op;
62 <        int  i;
62 >        OBJECT  i;
63  
64          i = modifier(mname);            /* try hash table first */
65          if ((obj == OVOID) | (i < obj))
66                  return(i);
67          for (i = obj; i-- > 0; ) {      /* need to search */
68                  op = objptr(i);
69 <                if (ismodifier(op->otype) && op->oname[0] == mname[0] &&
70 <                                        !strcmp(op->oname, mname))
69 >                if ((ismodifier(op->otype) != 0) & (op->oname[0] == mname[0])
70 >                                && !strcmp(op->oname, mname))
71                          return(i);
72          }
73          return(OVOID);
# Line 196 | Line 207 | truncobjndx(void)              /* remove bogus table entries past
207  
208          if (nobjects <= 0) {
209                  if (modtab.htab != NULL) {
210 <                        free((void *)modtab.htab);
210 >                        free(modtab.htab);
211                          modtab.htab = NULL;
212                          modtab.hsiz = 100;
213                  }
214                  if (objtab.htab != NULL) {
215 <                        free((void *)objtab.htab);
215 >                        free(objtab.htab);
216                          objtab.htab = NULL;
217                          objtab.hsiz = 100;
218                  }
# Line 278 | Line 289 | tryagain:
289                          i = otndx(onm, tab);
290                          tab->htab[i] = oldhtab[ndx];
291                  }
292 <        free((void *)oldhtab);
292 >        free(oldhtab);
293          goto tryagain;                  /* should happen only once! */
294   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines