summaryrefslogtreecommitdiff
path: root/src/gdbmopen.c
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org>2021-11-07 20:18:31 +0200
committerSergey Poznyakoff <gray@gnu.org>2021-11-14 13:29:42 +0200
commit322f6e9c3c13d3079306628b96864f728f87be62 (patch)
tree997592aae23da27552e9cbc3549dd58b2e044e5b /src/gdbmopen.c
parent45d2ce49d88bc59bbc84dc738a55142205a6e2ce (diff)
downloadgdbm-322f6e9c3c13d3079306628b96864f728f87be62.tar.gz
Switch to hash table cache implementation
* src/cachetree.c: Remove. * src/Makefile.am: Remove cachetree.c * doc/gdbm.texi: Document the changes. * src/bucket.c (cache_tab_lookup_slot) (cache_tab_resize): New function. (cache_elem_new): Initialize ca_coll. (cache_elem_free, cache_lookup) (_gdbm_cache_init,_gdbm_cache_free): Rewrite with hash-based cache lookup. (_gdbm_fetch_data): Remove unused function. * src/gdbm.h.in (GDBM_GETDBFORMAT, GDBM_GETDIRDEPTH) (GDBM_GETBUCKETSIZE, GDBM_GETCACHEAUTO, GDBM_SETCACHEAUTO): New option codes. * src/gdbmdefs.h (cache_node): Remove. (cache_elem): Remove ca_node. Add ca_coll (collision resolution pointer). (gdbm_file_info): New members: cache_auto, cache_bits, cache. * src/gdbmopen.c (gdbm_fd_open): Change cache initialization. * src/gdbmsetopt.c (GDBM_GETDBFORMAT,GDBM_GETDIRDEPTH) (GDBM_GETBUCKETSIZE,GDBM_GETCACHEAUTO) (GDBM_SETCACHEAUTO): Implement new options. (setopt_gdbm_getflags): Reflect the state of GDBM_CLOEXEC and GDBM_NUMSYNC. * src/proto.h (_gdbm_fetch_data,_gdbm_cache_tree_alloc) (_gdbm_cache_tree_destroy,_gdbm_cache_tree_delete) (_gdbm_cache_tree_lookup): Remove protos. * src/recover.c (_gdbm_finish_transfer): Restore original cache settings. * tests/Makefile.am: Add new test. * tests/testsuite.at: Likewise. * tests/gtcacheopt.c: New file. * tests/setopt02.at: New test case.
Diffstat (limited to 'src/gdbmopen.c')
-rw-r--r--src/gdbmopen.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/src/gdbmopen.c b/src/gdbmopen.c
index 4b154be..3994dd4 100644
--- a/src/gdbmopen.c
+++ b/src/gdbmopen.c
@@ -271,10 +271,6 @@ gdbm_fd_open (int fd, const char *file_name, int block_size,
dbf->bucket = NULL;
dbf->header = NULL;
- /* Initialize cache */
- dbf->cache_tree = _gdbm_cache_tree_alloc ();
- _gdbm_cache_init (dbf, DEFAULT_CACHESIZE);
-
dbf->file_size = -1;
dbf->memory_mapping = FALSE;
@@ -640,6 +636,17 @@ gdbm_fd_open (int fd, const char *file_name, int block_size,
}
+ if (_gdbm_cache_init (dbf, DEFAULT_CACHESIZE))
+ {
+ GDBM_DEBUG (GDBM_DEBUG_ERR|GDBM_DEBUG_OPEN,
+ "%s: error initializing cache: %s",
+ dbf->name, gdbm_db_strerror (dbf));
+ if (!(flags & GDBM_CLOERROR))
+ dbf->desc = -1;
+ SAVE_ERRNO (gdbm_close (dbf));
+ return NULL;
+ }
+
#if HAVE_MMAP
if (!(flags & GDBM_NOMMAP))
{