diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2021-11-07 20:18:31 +0200 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2021-11-14 13:29:42 +0200 |
commit | 322f6e9c3c13d3079306628b96864f728f87be62 (patch) | |
tree | 997592aae23da27552e9cbc3549dd58b2e044e5b /src/gdbmopen.c | |
parent | 45d2ce49d88bc59bbc84dc738a55142205a6e2ce (diff) | |
download | gdbm-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.c | 15 |
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)) { |