diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2016-07-20 14:40:08 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2016-07-20 14:50:21 +0300 |
commit | de7834e96602695db1cb6efd6238398b84d2ca60 (patch) | |
tree | 2fc49853a76d68a8db11aab24017843102fd22a8 /src/bucket.c | |
parent | fbb0df69ca498a4fb4689a6d12c2f05e2cfaf175 (diff) | |
download | gdbm-de7834e96602695db1cb6efd6238398b84d2ca60.tar.gz gdbm-de7834e96602695db1cb6efd6238398b84d2ca60.tar.bz2 |
Introduce debug hooks.
* configure.ac: New option --enable-debug
Print feature summary at the end of the run.
* src/debug.c: New file.
* src/Makefile.am [GDBM_COND_DEBUG_ENABLE]: Build debug.o
Define GDBM_DEBUG_ENABLE.
* src/gdbmdefs.h [GDBM_DEBUG_ENABLE] (_gdbm_debug_hook_install)
(_gdbm_debug_hook_remove,_gdbm_debug_hook_check)
(_gdbm_debug_hook_val): New protos.
(GDBM_DEBUG_HOOK, GDBM_DEBUG_OVERRIDE)
(GDBM_DEBUG_ALLOC): New defines.
* src/gdbm.h.in (GDBM_RCVR_FORCE): New flag.
* src/recover.c (gdbm_recover): Check database before attempting
recovery, unless GDBM_RCVR_FORCE flag is set.
* doc/gdbm.texi: Document GDBM_RCVR_FORCE
* src/gdbmreorg.c (gdbm_reorganize): Use GDBM_RCVR_FORCE.
* src/gdbmtool.c (main): Always allocate file_name.
* src/bucket.c: Put GDBM_DEBUG_OVERRIDE and GDBM_DEBUG_ALLOC
in critical places.
* src/falloc.c: Likewise.
* src/findkey.c: Likewise.
* src/gdbmopen.c: Likewise.
* src/gdbmstore.c: Likewise.
* src/update.c: Likewise.
* tests/Makefile.am [GDBM_COND_DEBUG_ENABLE]: Define GDBM_DEBUG_ENABLE.
* tests/gtload.c: New options -hook, -recover, -verbose,
-backup, -max-failures, -max-failed-keys,
and -max-failed-buckets.
Attempt recovery after errors.
Diffstat (limited to 'src/bucket.c')
-rw-r--r-- | src/bucket.c | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/src/bucket.c b/src/bucket.c index 7eb3898..cd9575c 100644 --- a/src/bucket.c +++ b/src/bucket.c @@ -98,7 +98,8 @@ _gdbm_get_bucket (GDBM_FILE dbf, int dir_index) dbf->cache_entry->ca_changed = FALSE; /* Read the bucket. */ - file_pos = __lseek (dbf, bucket_adr, SEEK_SET); + file_pos = GDBM_DEBUG_OVERRIDE ("_gdbm_get_bucket:seek-failure", + __lseek (dbf, bucket_adr, SEEK_SET)); if (file_pos != bucket_adr) { _gdbm_fatal (dbf, _("lseek error")); @@ -106,7 +107,8 @@ _gdbm_get_bucket (GDBM_FILE dbf, int dir_index) return -1; } - rc = _gdbm_full_read (dbf, dbf->bucket, dbf->header->bucket_size); + rc = GDBM_DEBUG_OVERRIDE ("_gdbm_get_bucket:read-failure", + _gdbm_full_read (dbf, dbf->bucket, dbf->header->bucket_size)); if (rc) { _gdbm_fatal (dbf, gdbm_strerror (rc)); @@ -248,7 +250,8 @@ _gdbm_split_bucket (GDBM_FILE dbf, int next_insert) dir_adr = _gdbm_alloc (dbf, dir_size); if (dir_adr == 0) return -1; - new_dir = (off_t *) malloc (dir_size); + new_dir = GDBM_DEBUG_ALLOC ("_gdbm_split_bucket:malloc-failure", + malloc (dir_size)); if (new_dir == NULL) { gdbm_set_errno (dbf, GDBM_MALLOC_ERROR, TRUE); @@ -286,7 +289,7 @@ _gdbm_split_bucket (GDBM_FILE dbf, int next_insert) while (bucket[select]->h_table[elem_loc].hash_value != -1) elem_loc = (elem_loc + 1) % dbf->header->bucket_elems; bucket[select]->h_table[elem_loc] = *old_el; - bucket[select]->count += 1; + bucket[select]->count++; } /* Allocate avail space for the bucket[1]. */ @@ -378,15 +381,17 @@ _gdbm_write_bucket (GDBM_FILE dbf, cache_elem *ca_entry) { int rc; off_t file_pos; /* The return value for lseek. */ - - file_pos = __lseek (dbf, ca_entry->ca_adr, SEEK_SET); + + file_pos = GDBM_DEBUG_OVERRIDE ("_gdbm_write_bucket:seek-failure", + __lseek (dbf, ca_entry->ca_adr, SEEK_SET)); if (file_pos != ca_entry->ca_adr) { gdbm_set_errno (dbf, GDBM_FILE_SEEK_ERROR, TRUE); _gdbm_fatal (dbf, _("lseek error")); return -1; } - rc = _gdbm_full_write (dbf, ca_entry->ca_bucket, dbf->header->bucket_size); + rc = GDBM_DEBUG_OVERRIDE ("_gdbm_write_bucket:write-failure", + _gdbm_full_write (dbf, ca_entry->ca_bucket, dbf->header->bucket_size)); if (rc) { gdbm_set_errno (dbf, rc, TRUE); |