diff options
author | Quincey Koziol <koziol@hdfgroup.org> | 2006-03-04 22:56:44 (GMT) |
---|---|---|
committer | Quincey Koziol <koziol@hdfgroup.org> | 2006-03-04 22:56:44 (GMT) |
commit | dfbf976509bea0b4d598716d0dd73be494efacdd (patch) | |
tree | 891886081cf2ed280788eb2a33c609c55dfe2391 /src/H5HFdbg.c | |
parent | 0e708b387c78f5a286ab82eda55214fddf6c2127 (diff) | |
download | hdf5-dfbf976509bea0b4d598716d0dd73be494efacdd.zip hdf5-dfbf976509bea0b4d598716d0dd73be494efacdd.tar.gz hdf5-dfbf976509bea0b4d598716d0dd73be494efacdd.tar.bz2 |
[svn-r12004] Purpose:
New feature & code cleanup
Description:
Update fractal heap to be able to insert objects into a direct block
hanging off the header.
Extract "octal dump" code into separate routine so that both the local
heaps & fractal heaps can use it.
Other code cleanups & support to get this far.
Platforms tested:
FreeBSD 4.11 (sleipnir)
Linux 2.4
Diffstat (limited to 'src/H5HFdbg.c')
-rw-r--r-- | src/H5HFdbg.c | 221 |
1 files changed, 218 insertions, 3 deletions
diff --git a/src/H5HFdbg.c b/src/H5HFdbg.c index 4216e96..2024402 100644 --- a/src/H5HFdbg.c +++ b/src/H5HFdbg.c @@ -33,9 +33,10 @@ /* Headers */ /***********/ #include "H5private.h" /* Generic Functions */ -#include "H5HFpkg.h" /* Fractal heaps */ #include "H5Eprivate.h" /* Error handling */ #include "H5FLprivate.h" /* Free Lists */ +#include "H5HFpkg.h" /* Fractal heaps */ +#include "H5MMprivate.h" /* Memory management */ /****************/ /* Local Macros */ @@ -51,6 +52,9 @@ /* Local Prototypes */ /********************/ +static herr_t H5HF_dtable_debug(H5HF_dtable_param_t *dt_param, FILE *stream, + int indent, int fwidth); + /*********************/ /* Package Variables */ @@ -68,6 +72,61 @@ /*------------------------------------------------------------------------- + * Function: H5HF_dtable_debug + * + * Purpose: Prints debugging info about a doubling table + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: Quincey Koziol + * koziol@ncsa.uiuc.edu + * Feb 28 2006 + * + *------------------------------------------------------------------------- + */ +static herr_t +H5HF_dtable_debug(H5HF_dtable_param_t *dt_param, FILE *stream, int indent, int fwidth) +{ + FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5HF_dtable_debug) + + /* + * Check arguments. + */ + HDassert(dt_param); + HDassert(stream); + HDassert(indent >= 0); + HDassert(fwidth >= 0); + + /* + * Print the values. + */ + HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth, + "Doubling table width:", + dt_param->cparam.width); + HDfprintf(stream, "%*s%-*s %Zu\n", indent, "", fwidth, + "Starting block size:", + dt_param->cparam.start_block_size); + HDfprintf(stream, "%*s%-*s %Zu\n", indent, "", fwidth, + "Max. direct block size:", + dt_param->cparam.max_direct_size); + HDfprintf(stream, "%*s%-*s %u (bits)\n", indent, "", fwidth, + "Max. index size:", + dt_param->cparam.max_index); + HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth, + "Starting # of rows in root indirect block:", + dt_param->cparam.start_root_rows); + HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth, + "Table's root address:", + dt_param->table_addr); + HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth, + "Current # of rows in root indirect block:", + dt_param->curr_root_rows); + + FUNC_LEAVE_NOAPI(SUCCEED) +} /* end H5HF_dtable_debug() */ + + +/*------------------------------------------------------------------------- * Function: H5HF_hdr_debug * * Purpose: Prints debugging info about a fractal heap header. @@ -102,7 +161,7 @@ H5HF_hdr_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent, * Load the fractal heap header. */ if(NULL == (fh = H5AC_protect(f, dxpl_id, H5AC_FHEAP_HDR, addr, NULL, NULL, H5AC_READ))) - HGOTO_ERROR(H5E_BTREE, H5E_CANTLOAD, FAIL, "unable to load fractal heap header") + HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, FAIL, "unable to load fractal heap header") /* Get the pointer to the shared fractal heap info */ shared = H5RC_GET_OBJ(fh->shared); @@ -125,11 +184,167 @@ H5HF_hdr_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent, HDfprintf(stream, "%*s%-*s %lu\n", indent, "", fwidth, "Fixed length object size:", (unsigned long)shared->fixed_len_size); + HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth, + "Ref. count size:", + (unsigned)shared->ref_count_size); + + HDfprintf(stream, "%*sManaged Objects Doubling-Table Info...\n", indent, ""); + H5HF_dtable_debug(&shared->man_dtable_info, stream, indent + 3, MAX(0, fwidth -3)); done: if(fh && H5AC_unprotect(f, dxpl_id, H5AC_FHEAP_HDR, addr, fh, H5AC__NO_FLAGS_SET) < 0) - HDONE_ERROR(H5E_BTREE, H5E_PROTECT, FAIL, "unable to release fractal heap header") + HDONE_ERROR(H5E_HEAP, H5E_PROTECT, FAIL, "unable to release fractal heap header") FUNC_LEAVE_NOAPI(ret_value) } /* end H5HF_hdr_debug() */ + +/*------------------------------------------------------------------------- + * Function: H5HF_dblock_debug + * + * Purpose: Prints debugging info about a fractal heap direct block. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: Quincey Koziol + * koziol@ncsa.uiuc.edu + * Feb 28 2006 + * + *------------------------------------------------------------------------- + */ +herr_t +H5HF_dblock_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, + int indent, int fwidth, haddr_t hdr_addr, size_t block_size) +{ + H5HF_t *fh = NULL; /* Fractal heap header info */ + H5HF_direct_t *dblock = NULL; /* Fractal heap direct block info */ + H5HF_direct_free_node_t *node; /* Pointer to free list node for block */ + H5HF_shared_t *shared; /* Shared fractal heap information */ + size_t blk_prefix_size; /* Size of prefix for block */ + unsigned node_count = 0; /* Number of free space nodes */ + size_t amount_free = 0; /* Amount of free space in block */ + uint8_t *marker = NULL; /* Track free space for block */ + size_t overlap; /* Number of free space overlaps */ + size_t u, v; /* Local index variable */ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(H5HF_dblock_debug, FAIL) + + /* + * Check arguments. + */ + HDassert(f); + HDassert(H5F_addr_defined(addr)); + HDassert(stream); + HDassert(indent >= 0); + HDassert(fwidth >= 0); + HDassert(H5F_addr_defined(hdr_addr)); + HDassert(block_size > 0); + + /* + * Load the fractal heap header. + */ + if(NULL == (fh = H5AC_protect(f, dxpl_id, H5AC_FHEAP_HDR, hdr_addr, NULL, NULL, H5AC_READ))) + HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, FAIL, "unable to load fractal heap header") + + /* Get the pointer to the shared fractal heap info */ + shared = H5RC_GET_OBJ(fh->shared); + HDassert(shared); + + /* + * Load the heap direct block + */ + if(NULL == (dblock = H5AC_protect(f, dxpl_id, H5AC_FHEAP_DBLOCK, addr, &block_size, fh->shared, H5AC_READ))) + HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, FAIL, "unable to load fractal heap direct block") + + /* Release the heap header */ + if(H5AC_unprotect(f, dxpl_id, H5AC_FHEAP_HDR, hdr_addr, fh, H5AC__NO_FLAGS_SET) < 0) + HDONE_ERROR(H5E_HEAP, H5E_PROTECT, FAIL, "unable to release fractal heap header") + fh = NULL; + + /* Print opening message */ + HDfprintf(stream, "%*sFractal Heap Direct Block...\n", indent, ""); + + /* + * Print the values. + */ + HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth, + "Address of fractal heap that owns this block:", + shared->heap_addr); + HDfprintf(stream, "%*s%-*s %Hu\n", indent, "", fwidth, + "Offset of direct block in heap:", + dblock->block_off); + blk_prefix_size = H5HF_MAN_ABS_DIRECT_OVERHEAD_DBLOCK(shared, dblock); + HDfprintf(stream, "%*s%-*s %Zu\n", indent, "", fwidth, + "Size of prefix:", + blk_prefix_size); + HDfprintf(stream, "%*s%-*s %Zu\n", indent, "", fwidth, + "Size of block offsets:", + dblock->blk_off_size); + HDfprintf(stream, "%*s%-*s %Zu\n", indent, "", fwidth, + "Total free space in block:", + dblock->blk_free_space); + HDfprintf(stream, "%*s%-*s %Zu\n", indent, "", fwidth, + "Offset of free list head:", + dblock->free_list_head); + + /* Check for valid free list */ + if(!dblock->free_list) + if(H5HF_man_dblock_build_freelist(dblock) < 0) + HGOTO_ERROR(H5E_HEAP, H5E_CANTDECODE, FAIL, "can't decode free list for block") + HDassert(dblock->free_list); + + /* + * Traverse the free list and check that all free blocks fall within + * the block and that no two free blocks point to the same region of + * the block. */ + if(NULL == (marker = H5MM_calloc(dblock->size))) + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed") + + HDfprintf(stream, "%*sFree Blocks (offset, next offset, size):\n", indent, ""); + node = dblock->free_list->first; + while(node) { + char temp_str[32]; + + sprintf(temp_str, "Block #%u:", node_count); + HDfprintf(stream, "%*s%-*s %8Zu, %8Zu, %8Zu\n", indent + 3, "", MAX(0, fwidth - 9), + temp_str, + node->my_offset, node->next_offset, node->size); + + if (node->my_offset + node->size > dblock->size) + fprintf(stream, "***THAT FREE BLOCK IS OUT OF BOUNDS!\n"); + else { + /* Mark this node's free space & check for overlaps w/other free space */ + for(u = overlap = 0; u < node->size; u++) { + if(marker[node->my_offset + u]) + overlap++; + marker[node->my_offset + u] = 1; + } /* end for */ + + if (overlap) + fprintf(stream, "***THAT FREE BLOCK OVERLAPPED A PREVIOUS ONE!\n"); + else + amount_free += node->size; + } /* end else */ + + /* Avance to next node */ + node = node->next; + node_count++; + } /* end while */ + + HDfprintf(stream, "%*s%-*s %.2f%%\n", indent, "", fwidth, + "Percent of block used:", + (100.0 * (double)(dblock->size - (blk_prefix_size + amount_free)) / (double)dblock->size)); + + /* + * Print the data in a VMS-style octal dump. + */ + H5_buffer_dump(stream, indent, dblock->blk, marker, 0, dblock->size); + +done: + if(dblock && H5AC_unprotect(f, dxpl_id, H5AC_FHEAP_DBLOCK, addr, dblock, H5AC__NO_FLAGS_SET) < 0) + HDONE_ERROR(H5E_HEAP, H5E_PROTECT, FAIL, "unable to release fractal heap direct block") + + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5HF_dblock_debug() */ + |