summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org>2021-11-10 20:43:16 +0200
committerSergey Poznyakoff <gray@gnu.org>2021-11-10 20:43:16 +0200
commitb894c7104819fd22508365faad4ae9accdeef788 (patch)
tree620acff3d07de47e983aedf1c3a0b341bcd21617
parentd692a1f1b5c99122608f6e1b4a8bad5d76793803 (diff)
downloadgdbm-b894c7104819fd22508365faad4ae9accdeef788.tar.gz
Optimize cache_elem_lookup_slot
-rw-r--r--src/bucket.c23
1 files changed, 15 insertions, 8 deletions
diff --git a/src/bucket.c b/src/bucket.c
index f69380a..15cfe9d 100644
--- a/src/bucket.c
+++ b/src/bucket.c
@@ -182,16 +182,23 @@ static cache_elem **
cache_elem_lookup_slot (cache_elem **cache, size_t nbits, off_t adr)
{
size_t h = adrhash (adr, nbits);
- cache_elem **pp;
-
- pp = cache + h;
- while (*pp)
+
+ if (cache[h])
{
- if ((*pp)->ca_adr == adr)
- break;
- pp = &(*pp)->ca_coll;
+ if (cache[h]->ca_adr != adr)
+ {
+ cache_elem *prev = cache[h], *p = prev->ca_coll;
+ while (p)
+ {
+ if (p->ca_adr == adr)
+ break;
+ prev = p;
+ p = prev->ca_coll;
+ }
+ return &prev->ca_coll;
+ }
}
- return pp;
+ return &cache[h];
}
static void