diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2021-01-03 17:17:02 +0200 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2021-01-03 17:17:02 +0200 |
commit | 0a5d1df2545a3cdbed6779e8aea1f3929d43d628 (patch) | |
tree | d11d514c3003be828d0ff6e30dbf0053b749d01e | |
parent | a6f1b4142dd4e811a2c0228d2e96efab81a204e0 (diff) | |
download | gdbm-bsearch.tar.gz |
Bugfixbsearch
* src/bucket.c (cache_lookup): Adjust insertion index
-rw-r--r-- | src/bucket.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/src/bucket.c b/src/bucket.c index bcd4be2..09a32e7 100644 --- a/src/bucket.c +++ b/src/bucket.c @@ -118,7 +118,7 @@ enum elem_found }; -int +static int cache_idx_lookup (GDBM_FILE dbf, off_t adr, size_t *idx) { if (dbf->cache_num == 0) @@ -201,6 +201,8 @@ cache_lookup (GDBM_FILE dbf, off_t adr, cache_elem *ref, cache_elem **ret_elem) case elem_new: if (!dbf->cache_avail) { + if (dbf->cache_lru->ca_adr < adr) + n--; if (cache_lru_free (dbf)) return elem_failure; } @@ -216,6 +218,9 @@ cache_lookup (GDBM_FILE dbf, off_t adr, cache_elem *ref, cache_elem **ret_elem) if (n < dbf->cache_num) memmove (&dbf->cache_idx[n + 1], &dbf->cache_idx[n], (dbf->cache_num - n) * sizeof (dbf->cache_idx[0])); + else if (n == dbf->cache_size) + n--; + dbf->cache_idx[n].elem = elem; elem->ca_adr = adr; |