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/update.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/update.c')
-rw-r--r-- | src/update.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/src/update.c b/src/update.c index 2ddfa4b..90a6524 100644 --- a/src/update.c +++ b/src/update.c @@ -29,8 +29,9 @@ write_header (GDBM_FILE dbf) { off_t file_pos; /* Return value for lseek. */ int rc; - - file_pos = __lseek (dbf, 0L, SEEK_SET); + + file_pos = GDBM_DEBUG_OVERRIDE ("write_header:lseek-failure", + __lseek (dbf, 0L, SEEK_SET)); if (file_pos != 0) { gdbm_set_errno (dbf, GDBM_FILE_SEEK_ERROR, TRUE); @@ -38,7 +39,9 @@ write_header (GDBM_FILE dbf) return -1; } - rc = _gdbm_full_write (dbf, dbf->header, dbf->header->block_size); + rc = GDBM_DEBUG_OVERRIDE ("write_header:write-failure", + _gdbm_full_write (dbf, dbf->header, dbf->header->block_size)); + if (rc) { gdbm_set_errno (dbf, rc, TRUE); @@ -92,7 +95,8 @@ _gdbm_end_update (GDBM_FILE dbf) /* Write the directory. */ if (dbf->directory_changed) { - file_pos = __lseek (dbf, dbf->header->dir, SEEK_SET); + file_pos = GDBM_DEBUG_OVERRIDE ("_gdbm_end_update:lseek-failure", + __lseek (dbf, dbf->header->dir, SEEK_SET)); if (file_pos != dbf->header->dir) { gdbm_set_errno (dbf, GDBM_FILE_SEEK_ERROR, TRUE); @@ -100,7 +104,8 @@ _gdbm_end_update (GDBM_FILE dbf) return -1; } - rc = _gdbm_full_write (dbf, dbf->dir, dbf->header->dir_size); + rc = GDBM_DEBUG_OVERRIDE ("_gdbm_end_update:write-dir-failure", + _gdbm_full_write (dbf, dbf->dir, dbf->header->dir_size)); if (rc) { gdbm_set_errno (dbf, rc, TRUE); |