From 5fb061e46e8b854bf745674562b71f3e76e1acd0 Mon Sep 17 00:00:00 2001 From: Quincey Koziol Date: Thu, 11 Sep 2008 15:16:05 -0500 Subject: [svn-r15617] Description: Clean up how v2 B-tree (and extensible array) classes are determined in h5debug. Add support for extensible array headers and index blocks to h5debug Tested on: Mac OS X/32 10.5.4 (amazon) in debug mode Mac OS X/32 10.5.4 (amazon) w/C++ & FORTRAN, w/threadsafe, in production mode FreeBSD/32 6.3 (duty) in debug mode FreeBSD/64 6.3 (liberty) w/C++ & FORTRAN, in debug mode Linux/32 2.6 (kagiso) w/PGI compilers, w/C++ & FORTRAN, w/threadsafe, in debug mode Linux/64-amd64 2.6 (smirom) w/Intel compilers w/default API=1.6.x, w/C++ & FORTRAN, in production mode Solaris/32 2.10 (linew) w/deprecated symbols disabled, w/C++ & FORTRAN, w/szip filter, in production mode Linux/64-ia64 2.6 (cobalt) w/Intel compilers, w/C++ & FORTRAN, in production mode Linux/64-ia64 2.4 (tg-login3) w/parallel, w/FORTRAN, in production mode Linux/64-amd64 2.6 (abe) w/parallel, w/FORTRAN, in production mode --- MANIFEST | 1 + src/H5B2cache.c | 8 +- src/H5EAcache.c | 14 +++ src/H5EAdbg.c | 232 +++++++++++++++++++++++++++++++++++++++ src/H5EApkg.h | 8 ++ src/H5EAprivate.h | 2 +- src/H5EAstat.c | 2 +- src/H5EAtest.c | 14 ++- src/Makefile.am | 4 +- src/Makefile.in | 5 +- tools/misc/h5debug.c | 305 +++++++++++++++++++++++++-------------------------- 11 files changed, 429 insertions(+), 166 deletions(-) create mode 100644 src/H5EAdbg.c diff --git a/MANIFEST b/MANIFEST index d36607e..3946690 100644 --- a/MANIFEST +++ b/MANIFEST @@ -500,6 +500,7 @@ ./src/H5Eterm.h ./src/H5EA.c ./src/H5EAcache.c +./src/H5EAdbg.c ./src/H5EAhdr.c ./src/H5EAiblock.c ./src/H5EAint.c diff --git a/src/H5B2cache.c b/src/H5B2cache.c index f6d95ce..82634a6 100644 --- a/src/H5B2cache.c +++ b/src/H5B2cache.c @@ -198,7 +198,7 @@ H5B2_cache_hdr_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, const void *_type, vo /* B-tree type */ if(*p++ != (uint8_t)type->id) - HGOTO_ERROR(H5E_BTREE, H5E_CANTLOAD, NULL, "incorrect B-tree type") + HGOTO_ERROR(H5E_BTREE, H5E_BADTYPE, NULL, "incorrect B-tree type") /* Node size (in bytes) */ UINT32DECODE(p, node_size); @@ -531,8 +531,8 @@ H5B2_cache_internal_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, const void *_uda HGOTO_ERROR(H5E_BTREE, H5E_CANTLOAD, NULL, "wrong B-tree internal node version") /* B-tree type */ - if (*p++ != (uint8_t)shared->type->id) - HGOTO_ERROR(H5E_BTREE, H5E_CANTLOAD, NULL, "incorrect B-tree type") + if(*p++ != (uint8_t)shared->type->id) + HGOTO_ERROR(H5E_BTREE, H5E_BADTYPE, NULL, "incorrect B-tree type") /* Allocate space for the native keys in memory */ if((internal->int_native = (uint8_t *)H5FL_FAC_MALLOC(shared->node_info[udata->depth].nat_rec_fac)) == NULL) @@ -887,7 +887,7 @@ H5B2_cache_leaf_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, const void *_nrec, v /* B-tree type */ if(*p++ != (uint8_t)shared->type->id) - HGOTO_ERROR(H5E_BTREE, H5E_CANTLOAD, NULL, "incorrect B-tree type") + HGOTO_ERROR(H5E_BTREE, H5E_BADTYPE, NULL, "incorrect B-tree type") /* Allocate space for the native keys in memory */ if((leaf->leaf_native = (uint8_t *)H5FL_FAC_MALLOC(shared->node_info[0].nat_rec_fac)) == NULL) diff --git a/src/H5EAcache.c b/src/H5EAcache.c index 6e141e9..3a8bba5 100644 --- a/src/H5EAcache.c +++ b/src/H5EAcache.c @@ -187,6 +187,10 @@ H5EA__cache_hdr_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, const void *_cls, vo if(*p++ != H5EA_HDR_VERSION) H5E_THROW(H5E_VERSION, "wrong extensible array header version") + /* Extensible array type */ + if(*p++ != (uint8_t)cls->id) + H5E_THROW(H5E_BADTYPE, "incorrect extensible array class") + /* General array creation/configuration information */ hdr->raw_elmt_size = *p++; /* Element size in file (in bytes) */ hdr->max_nelmts_bits = *p++; /* Log2(Max. # of elements in array) - i.e. # of bits needed to store max. # of elements */ @@ -286,6 +290,9 @@ H5EA__cache_hdr_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5 /* Version # */ *p++ = H5EA_HDR_VERSION; + /* Extensible array type */ + *p++ = hdr->cls->id; + /* General array creation/configuration information */ *p++ = hdr->raw_elmt_size; /* Element size in file (in bytes) */ *p++ = hdr->max_nelmts_bits; /* Log2(Max. # of elements in array) - i.e. # of bits needed to store max. # of elements */ @@ -492,6 +499,10 @@ H5EA__cache_iblock_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, const void UNUSED if(*p++ != H5EA_IBLOCK_VERSION) H5E_THROW(H5E_VERSION, "wrong extensible array index block version") + /* Extensible array type */ + if(*p++ != (uint8_t)hdr->cls->id) + H5E_THROW(H5E_BADTYPE, "incorrect extensible array class") + /* Internal information */ /* Decode elements in index block */ @@ -591,6 +602,9 @@ H5EA__cache_iblock_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, /* Version # */ *p++ = H5EA_IBLOCK_VERSION; + /* Extensible array type */ + *p++ = iblock->hdr->cls->id; + /* Internal information */ /* Encode elements in index block */ diff --git a/src/H5EAdbg.c b/src/H5EAdbg.c new file mode 100644 index 0000000..f36a65b --- /dev/null +++ b/src/H5EAdbg.c @@ -0,0 +1,232 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Copyright by The HDF Group. * + * Copyright by the Board of Trustees of the University of Illinois. * + * All rights reserved. * + * * + * This file is part of HDF5. The full HDF5 copyright notice, including * + * terms governing use, modification, and redistribution, is contained in * + * the files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/*------------------------------------------------------------------------- + * + * Created: H5EAdbg.c + * Sep 11 2008 + * Quincey Koziol + * + * Purpose: Dump debugging information about an extensible array. + * + *------------------------------------------------------------------------- + */ + +/**********************/ +/* Module Declaration */ +/**********************/ + +#define H5EA_MODULE + + +/***********************/ +/* Other Packages Used */ +/***********************/ + + +/***********/ +/* Headers */ +/***********/ +#include "H5private.h" /* Generic Functions */ +#include "H5Eprivate.h" /* Error handling */ +#include "H5EApkg.h" /* Extensible Arrays */ + + +/****************/ +/* Local Macros */ +/****************/ + + +/******************/ +/* Local Typedefs */ +/******************/ + + +/********************/ +/* Package Typedefs */ +/********************/ + + +/********************/ +/* Local Prototypes */ +/********************/ + + +/*********************/ +/* Package Variables */ +/*********************/ + + +/*****************************/ +/* Library Private Variables */ +/*****************************/ + + +/*******************/ +/* Local Variables */ +/*******************/ + + + +/*------------------------------------------------------------------------- + * Function: H5EA__hdr_debug + * + * Purpose: Prints debugging info about a extensible array header. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: Quincey Koziol + * koziol@hdfgroup.org + * Sep 11 2008 + * + *------------------------------------------------------------------------- + */ +BEGIN_FUNC(PKG, ERR, +herr_t, SUCCEED, FAIL, +H5EA__hdr_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent, + int fwidth, const H5EA_class_t *cls)) + + /* Local variables */ + H5EA_hdr_t *hdr = NULL; /* Shared extensible array header */ + + /* Check arguments */ + HDassert(f); + HDassert(H5F_addr_defined(addr)); + HDassert(stream); + HDassert(indent >= 0); + HDassert(fwidth >= 0); + HDassert(cls); + + /* Load the extensible array header */ + if(NULL == (hdr = (H5EA_hdr_t *)H5AC_protect(f, dxpl_id, H5AC_EARRAY_HDR, addr, cls, NULL, H5AC_READ))) + H5E_THROW(H5E_CANTPROTECT, "unable to load extensible array header") + + /* Print opening message */ + HDfprintf(stream, "%*sExtensible Array Header...\n", indent, ""); + + /* Print the values */ + HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth, + "Array class ID:", + (hdr->cls->id == H5EA_CLS_TEST_ID ? "H5EA_CLS_TEST_ID" : + "Unknown!")); + HDfprintf(stream, "%*s%-*s %Zu\n", indent, "", fwidth, + "Header size:", + hdr->size); + HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth, + "Raw Element Size:", + (unsigned)hdr->raw_elmt_size); + HDfprintf(stream, "%*s%-*s %Zu\n", indent, "", fwidth, + "Native Element Size (on this platform):", + hdr->cls->nat_elmt_size); + HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth, + "Log2(Max. # of elements in array):", + (unsigned)hdr->idx_blk_elmts); + HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth, + "Min. # of elements per data block:", + (unsigned)hdr->data_blk_min_elmts); + HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth, + "Min. # of data block pointers for a super block:", + (unsigned)hdr->sup_blk_min_data_ptrs); + HDfprintf(stream, "%*s%-*s %Hu\n", indent, "", fwidth, + "Highest element index stored (+1):", + hdr->max_idx_set); + HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth, + "Index Block Address:", + hdr->idx_blk_addr); + +CATCH + if(hdr && H5AC_unprotect(f, dxpl_id, H5AC_EARRAY_HDR, addr, hdr, H5AC__NO_FLAGS_SET) < 0) + H5E_THROW(H5E_CANTUNPROTECT, "unable to release extensible array header") + +END_FUNC(PKG) /* end H5EA__hdr_debug() */ + + +/*------------------------------------------------------------------------- + * Function: H5EA__iblock_debug + * + * Purpose: Prints debugging info about a extensible array index block. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: Quincey Koziol + * koziol@hdfgroup.org + * Sep 11 2008 + * + *------------------------------------------------------------------------- + */ +BEGIN_FUNC(PKG, ERR, +herr_t, SUCCEED, FAIL, +H5EA__iblock_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent, + int fwidth, const H5EA_class_t *cls, haddr_t hdr_addr)) + + /* Local variables */ + H5EA_hdr_t *hdr = NULL; /* Shared extensible array header */ + H5EA_iblock_t *iblock = NULL; /* Extensible array index block */ + + /* Check arguments */ + HDassert(f); + HDassert(H5F_addr_defined(addr)); + HDassert(stream); + HDassert(indent >= 0); + HDassert(fwidth >= 0); + HDassert(cls); + HDassert(H5F_addr_defined(hdr_addr)); + + /* Load the extensible array header */ + if(NULL == (hdr = (H5EA_hdr_t *)H5AC_protect(f, dxpl_id, H5AC_EARRAY_HDR, hdr_addr, cls, NULL, H5AC_READ))) + H5E_THROW(H5E_CANTPROTECT, "unable to load extensible array header") + + /* Sanity check */ + HDassert(H5F_addr_eq(hdr->idx_blk_addr, addr)); + + /* Protect index block */ + if(NULL == (iblock = H5EA__iblock_protect(hdr, dxpl_id, H5AC_READ))) + H5E_THROW(H5E_CANTPROTECT, "unable to protect extensible array index block, address = %llu", (unsigned long_long)hdr->idx_blk_addr) + + /* Print opening message */ + HDfprintf(stream, "%*sExtensible Array Index Block...\n", indent, ""); + + /* Print the values */ + HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth, + "Array class ID:", + (hdr->cls->id == H5EA_CLS_TEST_ID ? "H5EA_CLS_TEST_ID" : + "Unknown!")); + HDfprintf(stream, "%*s%-*s %Zu\n", indent, "", fwidth, + "Index Block size:", + iblock->size); + + /* Check if there are any elements in array */ + if(hdr->max_idx_set > 0) { + unsigned u; /* Local index variable */ + + /* Print the elements in the index block */ + HDfprintf(stream, "%*sElements in Index Block:\n", indent, ""); + for(u = 0; u < MIN(hdr->idx_blk_elmts, hdr->max_idx_set); u++) { + /* Call the class's 'debug' callback */ + if((hdr->cls->debug)(stream, (indent + 6), MAX(0, (fwidth - 6)), + (hsize_t)u, + ((uint8_t *)iblock->elmts) + (hdr->cls->nat_elmt_size * u)) < 0) + H5E_THROW(H5E_CANTGET, "can't get element for debugging") + } /* end for */ + } /* end if */ + +CATCH + if(iblock && H5EA__iblock_unprotect(iblock, dxpl_id, H5AC__NO_FLAGS_SET) < 0) + H5E_THROW(H5E_CANTUNPROTECT, "unable to release extensible array index block") + if(hdr && H5AC_unprotect(f, dxpl_id, H5AC_EARRAY_HDR, hdr_addr, hdr, H5AC__NO_FLAGS_SET) < 0) + H5E_THROW(H5E_CANTUNPROTECT, "unable to release extensible array header") + +END_FUNC(PKG) /* end H5EA__hdr_debug() */ + diff --git a/src/H5EApkg.h b/src/H5EApkg.h index b0f351f..74ed3fb 100644 --- a/src/H5EApkg.h +++ b/src/H5EApkg.h @@ -357,6 +357,7 @@ func_init_failed: \ #define H5EA_METADATA_PREFIX_SIZE(c) ( \ H5EA_SIZEOF_MAGIC /* Signature */ \ + 1 /* Version */ \ + + 1 /* Array type */ \ + ((c) ? H5EA_SIZEOF_CHKSUM : 0) /* Metadata checksum */ \ ) @@ -500,6 +501,13 @@ H5_DLL herr_t H5EA__iblock_delete(H5EA_hdr_t *hdr, hid_t dxpl_id); H5_DLL herr_t H5EA__cache_hdr_dest(H5F_t *f, H5EA_hdr_t *hdr); H5_DLL herr_t H5EA__cache_iblock_dest(H5F_t *f, H5EA_iblock_t *iblock); +/* Debugging routines for dumping file structures */ +H5_DLL herr_t H5EA__hdr_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, + FILE *stream, int indent, int fwidth, const H5EA_class_t *cls); +H5_DLL herr_t H5EA__iblock_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, + FILE *stream, int indent, int fwidth, const H5EA_class_t *cls, + haddr_t hdr_addr); + /* Testing routines */ #ifdef H5EA_TESTING H5_DLL herr_t H5EA_get_cparam_test(const H5EA_t *ea, H5EA_create_t *cparam); diff --git a/src/H5EAprivate.h b/src/H5EAprivate.h index 5893ebb..667af3d7 100644 --- a/src/H5EAprivate.h +++ b/src/H5EAprivate.h @@ -65,7 +65,7 @@ typedef struct H5EA_class_t { herr_t (*fill)(void *nat_blk, size_t nelmts); /* Fill array of elements with encoded form of "missing element" value */ herr_t (*encode)(void *raw, const void *elmt, size_t nelmts); /* Encode elements from native form to disk storage form */ herr_t (*decode)(const void *raw, void *elmt, size_t nelmts); /* Decode elements from disk storage form to native form */ - herr_t (*debug)(FILE *stream, int indent, int fwidth, const void *elmt); /* Print an element for debugging */ + herr_t (*debug)(FILE *stream, int indent, int fwidth, hsize_t idx, const void *elmt); /* Print an element for debugging */ } H5EA_class_t; /* Extensible array creation parameters */ diff --git a/src/H5EAstat.c b/src/H5EAstat.c index 8b0460c..33a8d4b 100644 --- a/src/H5EAstat.c +++ b/src/H5EAstat.c @@ -16,7 +16,7 @@ /*------------------------------------------------------------------------- * * Created: H5EAstat.c - * Sep 11 2009 + * Sep 11 2008 * Quincey Koziol * * Purpose: Extensible array metadata statistics functions. diff --git a/src/H5EAtest.c b/src/H5EAtest.c index 8f2e038..00e6e64 100644 --- a/src/H5EAtest.c +++ b/src/H5EAtest.c @@ -65,7 +65,8 @@ static herr_t H5EA__test_fill(void *nat_blk, size_t nelmts); static herr_t H5EA__test_encode(void *raw, const void *elmt, size_t nelmts); static herr_t H5EA__test_decode(const void *raw, void *elmt, size_t nelmts); -static herr_t H5EA__test_debug(FILE *stream, int indent, int fwidth, const void *elmt); +static herr_t H5EA__test_debug(FILE *stream, int indent, int fwidth, + hsize_t idx, const void *elmt); /*********************/ @@ -221,12 +222,21 @@ END_FUNC(STATIC) /* end H5EA__test_decode() */ */ BEGIN_FUNC(STATIC, NOERR, herr_t, SUCCEED, -, -H5EA__test_debug(FILE *stream, int indent, int fwidth, const void *elmt)) +H5EA__test_debug(FILE *stream, int indent, int fwidth, hsize_t idx, + const void *elmt)) + + /* Local variables */ + char temp_str[128]; /* Temporary string, for formatting */ /* Sanity checks */ HDassert(stream); HDassert(elmt); + /* Print element */ + sprintf(temp_str, "Element #%llu:", (unsigned long_long)idx); + HDfprintf(stream, "%*s%-*s %llu\n", indent, "", fwidth, temp_str, + (unsigned long_long)*(const uint64_t *)elmt); + END_FUNC(STATIC) /* end H5EA__test_debug() */ diff --git a/src/Makefile.am b/src/Makefile.am index 6111ed0..a6245b7 100755 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -51,8 +51,8 @@ libhdf5_la_SOURCES= H5.c H5checksum.c H5dbg.c H5system.c H5timer.c H5trace.c \ H5Dio.c \ H5Distore.c H5Dmpio.c H5Doh.c H5Dscatgath.c H5Dselect.c H5Dtest.c \ H5E.c H5Edeprec.c H5Eint.c \ - H5EA.c H5EAcache.c H5EAhdr.c H5EAiblock.c H5EAint.c H5EAstat.c \ - H5EAtest.c \ + H5EA.c H5EAcache.c H5EAdbg.c H5EAhdr.c H5EAiblock.c H5EAint.c \ + H5EAstat.c H5EAtest.c \ H5F.c H5Fdbg.c H5Ffake.c H5Fmount.c H5Fsfile.c H5Fsuper.c H5Ftest.c \ H5FD.c H5FDcore.c \ H5FDdirect.c H5FDfamily.c H5FDlog.c H5FDmpi.c H5FDmpio.c \ diff --git a/src/Makefile.in b/src/Makefile.in index b4900dc..d095185 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -86,7 +86,7 @@ am_libhdf5_la_OBJECTS = H5.lo H5checksum.lo H5dbg.lo H5system.lo \ H5Dcontig.lo H5Ddbg.lo H5Ddeprec.lo H5Defl.lo H5Dfill.lo \ H5Dint.lo H5Dio.lo H5Distore.lo H5Dmpio.lo H5Doh.lo \ H5Dscatgath.lo H5Dselect.lo H5Dtest.lo H5E.lo H5Edeprec.lo \ - H5Eint.lo H5EA.lo H5EAcache.lo H5EAhdr.lo H5EAiblock.lo H5EAint.lo \ + H5Eint.lo H5EA.lo H5EAcache.lo H5EAdbg.lo H5EAhdr.lo H5EAiblock.lo H5EAint.lo \ H5EAstat.lo H5EAtest.lo H5F.lo H5Fdbg.lo H5Ffake.lo H5Fmount.lo \ H5Fsfile.lo H5Fsuper.lo H5Ftest.lo H5FD.lo H5FDcore.lo \ H5FDdirect.lo H5FDfamily.lo H5FDlog.lo H5FDmpi.lo H5FDmpio.lo \ @@ -430,7 +430,7 @@ libhdf5_la_SOURCES = H5.c H5checksum.c H5dbg.c H5system.c H5timer.c H5trace.c \ H5Dio.c \ H5Distore.c H5Dmpio.c H5Doh.c H5Dscatgath.c H5Dselect.c H5Dtest.c \ H5E.c H5Edeprec.c H5Eint.c \ - H5EA.c H5EAcache.c H5EAhdr.c H5EAiblock.c H5EAint.c H5EAstat.c H5EAtest.c \ + H5EA.c H5EAcache.c H5EAdbg.c H5EAhdr.c H5EAiblock.c H5EAint.c H5EAstat.c H5EAtest.c \ H5F.c H5Fdbg.c H5Ffake.c H5Fmount.c H5Fsfile.c H5Fsuper.c H5Ftest.c \ H5FD.c H5FDcore.c \ H5FDdirect.c H5FDfamily.c H5FDlog.c H5FDmpi.c H5FDmpio.c \ @@ -642,6 +642,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5E.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5EA.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5EAcache.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5EAdbg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5EAhdr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5EAiblock.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5EAint.Plo@am__quote@ diff --git a/tools/misc/h5debug.c b/tools/misc/h5debug.c index fa6d1ec..95bd345 100644 --- a/tools/misc/h5debug.c +++ b/tools/misc/h5debug.c @@ -28,6 +28,8 @@ #define H5A_PACKAGE /*suppress error about including H5Apkg */ #define H5B2_PACKAGE /*suppress error about including H5B2pkg */ #define H5B2_TESTING /*suppress warning about H5B2 testing funcs*/ +#define H5EA_PACKAGE /*suppress error about including H5EApkg */ +#define H5EA_TESTING /*suppress warning about H5EA testing funcs*/ #define H5F_PACKAGE /*suppress error about including H5Fpkg */ #define H5FS_PACKAGE /*suppress error about including H5FSpkg */ #define H5G_PACKAGE /*suppress error about including H5Gpkg */ @@ -41,6 +43,7 @@ #include "H5B2pkg.h" /* v2 B-trees */ #include "H5Dprivate.h" /* Datasets */ #include "H5Eprivate.h" /* Error handling */ +#include "H5EApkg.h" /* Extensible Arrays */ #include "H5Fpkg.h" /* File access */ #include "H5FSpkg.h" /* File free space */ #include "H5Gpkg.h" /* Groups */ @@ -55,11 +58,116 @@ /* File drivers */ #include "H5FDfamily.h" -#define INDENT 3 #define VCOL 50 /*------------------------------------------------------------------------- + * Function: get_H5B2_class + * + * Purpose: Determine the v2 B-tree class from the buffer read in. + * B-trees are debugged through the B-tree subclass. The subclass + * identifier is two bytes after the B-tree signature. + * + * Return: Non-NULL on success/NULL on failure + * + * Programmer: Quincey Koziol + * koziol@hdfgroup.org + * Sep 11 2008 + * + *------------------------------------------------------------------------- + */ +static const H5B2_class_t * +get_H5B2_class(const uint8_t *sig) +{ + H5B2_subid_t subtype = (H5B2_subid_t)sig[H5B2_SIZEOF_MAGIC + 1]; + const H5B2_class_t *cls; + + switch(subtype) { + case H5B2_TEST_ID: + cls = H5B2_TEST; + break; + + case H5B2_FHEAP_HUGE_INDIR_ID: + cls = H5HF_BT2_INDIR; + break; + + case H5B2_FHEAP_HUGE_FILT_INDIR_ID: + cls = H5HF_BT2_FILT_INDIR; + break; + + case H5B2_FHEAP_HUGE_DIR_ID: + cls = H5HF_BT2_DIR; + break; + + case H5B2_FHEAP_HUGE_FILT_DIR_ID: + cls = H5HF_BT2_FILT_DIR; + break; + + case H5B2_GRP_DENSE_NAME_ID: + cls = H5G_BT2_NAME; + break; + + case H5B2_GRP_DENSE_CORDER_ID: + cls = H5G_BT2_CORDER; + break; + + case H5B2_SOHM_INDEX_ID: + cls = H5SM_INDEX; + break; + + case H5B2_ATTR_DENSE_NAME_ID: + cls = H5A_BT2_NAME; + break; + + case H5B2_ATTR_DENSE_CORDER_ID: + cls = H5A_BT2_CORDER; + break; + + default: + fprintf(stderr, "Unknown B-tree subtype %u\n", (unsigned)(subtype)); + HDexit(4); + } /* end switch */ + + return(cls); +} /* end get_H5B2_class() */ + + +/*------------------------------------------------------------------------- + * Function: get_H5EA_class + * + * Purpose: Determine the extensible array class from the buffer read in. + * Extensible arrays are debugged through the array subclass. + * The subclass identifier is two bytes after the signature. + * + * Return: Non-NULL on success/NULL on failure + * + * Programmer: Quincey Koziol + * koziol@hdfgroup.org + * Sep 11 2008 + * + *------------------------------------------------------------------------- + */ +static const H5EA_class_t * +get_H5EA_class(const uint8_t *sig) +{ + H5EA_cls_id_t clsid = (H5EA_cls_id_t)sig[H5EA_SIZEOF_MAGIC + 1]; + const H5EA_class_t *cls; + + switch(clsid) { + case H5EA_CLS_TEST_ID: + cls = H5EA_CLS_TEST; + break; + + default: + fprintf(stderr, "Unknown array class %u\n", (unsigned)(clsid)); + HDexit(4); + } /* end switch */ + + return(cls); +} /* end get_H5EA_class() */ + + +/*------------------------------------------------------------------------- * Function: main * * Usage: debug FILENAME [OFFSET] @@ -112,7 +220,7 @@ main(int argc, char *argv[]) fprintf(stderr, "cannot open file\n"); HDexit(1); } /* end if */ - if(NULL == (f = H5I_object(fid))) { + if(NULL == (f = (H5F_t *)H5I_object(fid))) { fprintf(stderr, "cannot obtain H5F_t pointer\n"); HDexit(2); } /* end if */ @@ -121,13 +229,13 @@ main(int argc, char *argv[]) * Parse command arguments. */ if(argc > 2) - addr = HDstrtoll(argv[2], NULL, 0); + addr = (haddr_t)HDstrtoll(argv[2], NULL, 0); if(argc > 3) - extra = HDstrtoll(argv[3], NULL, 0); + extra = (haddr_t)HDstrtoll(argv[3], NULL, 0); if(argc > 4) - extra2 = HDstrtoll(argv[4], NULL, 0); + extra2 = (haddr_t)HDstrtoll(argv[4], NULL, 0); if(argc > 5) - extra3 = HDstrtoll(argv[5], NULL, 0); + extra3 = (haddr_t)HDstrtoll(argv[5], NULL, 0); /* * Read the signature at the specified file position. @@ -210,65 +318,18 @@ main(int argc, char *argv[]) } else if(!HDmemcmp(sig, H5B2_HDR_MAGIC, (size_t)H5B2_SIZEOF_MAGIC)) { /* - * Debug a v2 B-tree. B-trees are debugged through the B-tree - * subclass. The subclass identifier is two bytes after the - * B-tree signature. + * Debug a v2 B-tree header. */ - H5B2_subid_t subtype = (H5B2_subid_t)sig[H5B2_SIZEOF_MAGIC+1]; - - switch(subtype) { - case H5B2_TEST_ID: - status = H5B2_hdr_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, H5B2_TEST); - break; - - case H5B2_FHEAP_HUGE_INDIR_ID: - status = H5B2_hdr_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, H5HF_BT2_INDIR); - break; - - case H5B2_FHEAP_HUGE_FILT_INDIR_ID: - status = H5B2_hdr_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, H5HF_BT2_FILT_INDIR); - break; - - case H5B2_FHEAP_HUGE_DIR_ID: - status = H5B2_hdr_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, H5HF_BT2_DIR); - break; - - case H5B2_FHEAP_HUGE_FILT_DIR_ID: - status = H5B2_hdr_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, H5HF_BT2_FILT_DIR); - break; - - case H5B2_GRP_DENSE_NAME_ID: - status = H5B2_hdr_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, H5G_BT2_NAME); - break; - - case H5B2_GRP_DENSE_CORDER_ID: - status = H5B2_hdr_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, H5G_BT2_CORDER); - break; - - case H5B2_SOHM_INDEX_ID: - status = H5B2_hdr_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, H5SM_INDEX); - break; - - case H5B2_ATTR_DENSE_NAME_ID: - status = H5B2_hdr_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, H5A_BT2_NAME); - break; - - case H5B2_ATTR_DENSE_CORDER_ID: - status = H5B2_hdr_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, H5A_BT2_CORDER); - break; - - default: - fprintf(stderr, "Unknown B-tree subtype %u\n", (unsigned)(subtype)); - HDexit(4); - } /* end switch */ + const H5B2_class_t *cls = get_H5B2_class(sig); + HDassert(cls); + status = H5B2_hdr_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, cls); } else if(!HDmemcmp(sig, H5B2_INT_MAGIC, (size_t)H5B2_SIZEOF_MAGIC)) { /* - * Debug a v2 B-tree. B-trees are debugged through the B-tree - * subclass. The subclass identifier is the byte after the - * B-tree signature. + * Debug a v2 B-tree internal node. */ - H5B2_subid_t subtype = (H5B2_subid_t)sig[H5B2_SIZEOF_MAGIC + 1]; + const H5B2_class_t *cls = get_H5B2_class(sig); + HDassert(cls); /* Check for enough valid parameters */ if(extra == 0 || extra2 == 0 || extra3 == 0) { @@ -279,59 +340,14 @@ main(int argc, char *argv[]) HDexit(4); } /* end if */ - switch(subtype) { - case H5B2_TEST_ID: - status = H5B2_int_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, H5B2_TEST, extra, (unsigned)extra2, (unsigned)extra3); - break; - - case H5B2_FHEAP_HUGE_INDIR_ID: - status = H5B2_int_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, H5HF_BT2_INDIR, extra, (unsigned)extra2, (unsigned)extra3); - break; - - case H5B2_FHEAP_HUGE_FILT_INDIR_ID: - status = H5B2_int_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, H5HF_BT2_FILT_INDIR, extra, (unsigned)extra2, (unsigned)extra3); - break; - - case H5B2_FHEAP_HUGE_DIR_ID: - status = H5B2_int_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, H5HF_BT2_DIR, extra, (unsigned)extra2, (unsigned)extra3); - break; - - case H5B2_FHEAP_HUGE_FILT_DIR_ID: - status = H5B2_int_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, H5HF_BT2_FILT_DIR, extra, (unsigned)extra2, (unsigned)extra3); - break; - - case H5B2_GRP_DENSE_NAME_ID: - status = H5B2_int_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, H5G_BT2_NAME, extra, (unsigned)extra2, (unsigned)extra3); - break; - - case H5B2_GRP_DENSE_CORDER_ID: - status = H5B2_int_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, H5G_BT2_CORDER, extra, (unsigned)extra2, (unsigned)extra3); - break; - - case H5B2_SOHM_INDEX_ID: - status = H5B2_int_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, H5SM_INDEX, extra, (unsigned)extra2, (unsigned)extra3); - break; - - case H5B2_ATTR_DENSE_NAME_ID: - status = H5B2_int_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, H5A_BT2_NAME, extra, (unsigned)extra2, (unsigned)extra3); - break; - - case H5B2_ATTR_DENSE_CORDER_ID: - status = H5B2_int_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, H5A_BT2_CORDER, extra, (unsigned)extra2, (unsigned)extra3); - break; - - default: - fprintf(stderr, "Unknown B-tree subtype %u\n", (unsigned)(subtype)); - HDexit(4); - } /* end switch */ + status = H5B2_int_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, cls, extra, (unsigned)extra2, (unsigned)extra3); } else if(!HDmemcmp(sig, H5B2_LEAF_MAGIC, (size_t)H5B2_SIZEOF_MAGIC)) { /* - * Debug a v2 B-tree. B-trees are debugged through the B-tree - * subclass. The subclass identifier is the byte after the - * B-tree signature. + * Debug a v2 B-tree leaf node. */ - H5B2_subid_t subtype = (H5B2_subid_t)sig[H5B2_SIZEOF_MAGIC + 1]; + const H5B2_class_t *cls = get_H5B2_class(sig); + HDassert(cls); /* Check for enough valid parameters */ if(extra == 0 || extra2 == 0) { @@ -341,51 +357,7 @@ main(int argc, char *argv[]) HDexit(4); } /* end if */ - switch(subtype) { - case H5B2_TEST_ID: - status = H5B2_leaf_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, H5B2_TEST, extra, (unsigned)extra2); - break; - - case H5B2_FHEAP_HUGE_INDIR_ID: - status = H5B2_leaf_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, H5HF_BT2_INDIR, extra, (unsigned)extra2); - break; - - case H5B2_FHEAP_HUGE_FILT_INDIR_ID: - status = H5B2_leaf_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, H5HF_BT2_FILT_INDIR, extra, (unsigned)extra2); - break; - - case H5B2_FHEAP_HUGE_DIR_ID: - status = H5B2_leaf_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, H5HF_BT2_DIR, extra, (unsigned)extra2); - break; - - case H5B2_FHEAP_HUGE_FILT_DIR_ID: - status = H5B2_leaf_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, H5HF_BT2_FILT_DIR, extra, (unsigned)extra2); - break; - - case H5B2_GRP_DENSE_NAME_ID: - status = H5B2_leaf_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, H5G_BT2_NAME, extra, (unsigned)extra2); - break; - - case H5B2_GRP_DENSE_CORDER_ID: - status = H5B2_leaf_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, H5G_BT2_CORDER, extra, (unsigned)extra2); - break; - - case H5B2_SOHM_INDEX_ID: - status = H5B2_leaf_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, H5SM_INDEX, extra, (unsigned)extra2); - break; - - case H5B2_ATTR_DENSE_NAME_ID: - status = H5B2_leaf_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, H5A_BT2_NAME, extra, (unsigned)extra2); - break; - - case H5B2_ATTR_DENSE_CORDER_ID: - status = H5B2_leaf_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, H5A_BT2_CORDER, extra, (unsigned)extra2); - break; - - default: - fprintf(stderr, "Unknown B-tree subtype %u\n", (unsigned)(subtype)); - HDexit(4); - } /* end switch */ + status = H5B2_leaf_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, cls, extra, (unsigned)extra2); } else if(!HDmemcmp(sig, H5HF_HDR_MAGIC, (size_t)H5HF_SIZEOF_MAGIC)) { /* @@ -467,6 +439,31 @@ main(int argc, char *argv[]) status = H5SM_list_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, (unsigned) extra, (size_t) extra2); + } else if(!HDmemcmp(sig, H5EA_HDR_MAGIC, (size_t)H5EA_SIZEOF_MAGIC)) { + /* + * Debug an extensible aray header. + */ + const H5EA_class_t *cls = get_H5EA_class(sig); + HDassert(cls); + status = H5EA__hdr_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, cls); + + } else if(!HDmemcmp(sig, H5EA_IBLOCK_MAGIC, (size_t)H5EA_SIZEOF_MAGIC)) { + /* + * Debug an extensible aray index block. + */ + const H5EA_class_t *cls = get_H5EA_class(sig); + HDassert(cls); + + /* Check for enough valid parameters */ + if(extra == 0) { + fprintf(stderr, "ERROR: Need extensible array header address in order to dump index block\n"); + fprintf(stderr, "Extensible array index block usage:\n"); + fprintf(stderr, "\th5debug \n"); + HDexit(4); + } /* end if */ + + status = H5EA__iblock_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, cls, extra); + } else if(!HDmemcmp(sig, H5O_HDR_MAGIC, (size_t)H5O_SIZEOF_MAGIC)) { /* * Debug v2 object header (which have signatures). -- cgit v0.12