diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2021-11-10 20:43:16 +0200 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2021-11-10 20:43:16 +0200 |
commit | b894c7104819fd22508365faad4ae9accdeef788 (patch) | |
tree | 620acff3d07de47e983aedf1c3a0b341bcd21617 | |
parent | d692a1f1b5c99122608f6e1b4a8bad5d76793803 (diff) | |
download | gdbm-b894c7104819fd22508365faad4ae9accdeef788.tar.gz |
Optimize cache_elem_lookup_slot
-rw-r--r-- | src/bucket.c | 23 |
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 |