summaryrefslogtreecommitdiffstats
path: root/src/H5HFiblock.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/H5HFiblock.c')
-rw-r--r--src/H5HFiblock.c54
1 files changed, 30 insertions, 24 deletions
diff --git a/src/H5HFiblock.c b/src/H5HFiblock.c
index 15c998c..70133aa 100644
--- a/src/H5HFiblock.c
+++ b/src/H5HFiblock.c
@@ -1575,10 +1575,11 @@ HDfprintf(stderr, "%s: iblock_addr = %a, iblock_nrows = %u\n", FUNC, iblock_addr
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5HF_man_iblock_delete() */
+
/*-------------------------------------------------------------------------
*
- * Function: H5HF_indirect_info
+ * Function: H5HF_man_iblock_size
*
* Purpose: Gather storage used for the indirect block in fractal heap
*
@@ -1589,15 +1590,15 @@ done:
*-------------------------------------------------------------------------
*/
herr_t
-H5HF_indirect_info(H5F_t *f, hid_t dxpl_id, H5HF_hdr_t *hdr, haddr_t iblock_addr, unsigned nrows, hsize_t *heap_size)
+H5HF_man_iblock_size(H5F_t *f, hid_t dxpl_id, H5HF_hdr_t *hdr, haddr_t iblock_addr,
+ unsigned nrows, hsize_t *heap_size)
{
- hbool_t did_protect;
- H5HF_indirect_t *iblock; /* Pointer to indirect block */
- size_t u, v;
- int reterr;
- int ret_value=SUCCEED;
+ H5HF_indirect_t *iblock = NULL; /* Pointer to indirect block */
+ hbool_t did_protect; /* Whether we protected the indirect block or not */
+ herr_t ret_value = SUCCEED; /* Return value */
+
+ FUNC_ENTER_NOAPI(H5HF_man_iblock_size, FAIL)
- FUNC_ENTER_NOAPI(H5HF_indirect_info, FAIL)
/*
* Check arguments.
*/
@@ -1606,34 +1607,39 @@ H5HF_indirect_info(H5F_t *f, hid_t dxpl_id, H5HF_hdr_t *hdr, haddr_t iblock_addr
HDassert(H5F_addr_defined(iblock_addr));
HDassert(heap_size);
- if (NULL == (iblock = H5HF_man_iblock_protect(hdr, dxpl_id, iblock_addr, nrows, NULL, 0, FALSE, H5AC_READ, &did_protect)))
+ /* Protect the indirect block */
+ if(NULL == (iblock = H5HF_man_iblock_protect(hdr, dxpl_id, iblock_addr, nrows, NULL, 0, FALSE, H5AC_READ, &did_protect)))
HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, FAIL, "unable to load fractal heap indirect block")
+ /* Accumulate size of this indirect block */
*heap_size += iblock->size;
/* Indirect entries in this indirect block */
if(iblock->nrows > hdr->man_dtable.max_direct_rows) {
- unsigned first_row_bits; /* Number of bits used bit addresses in first row */
- unsigned num_indirect_rows; /* Number of rows of blocks in each indirect block */
+ unsigned first_row_bits; /* Number of bits used bit addresses in first row */
+ unsigned num_indirect_rows; /* Number of rows of blocks in each indirect block */
+ unsigned entry; /* Current entry in row */
+ size_t u; /* Local index variable */
+ entry = hdr->man_dtable.max_direct_rows * hdr->man_dtable.cparam.width;
first_row_bits = H5V_log2_of2((uint32_t)hdr->man_dtable.cparam.start_block_size) +
H5V_log2_of2(hdr->man_dtable.cparam.width);
- for(u = hdr->man_dtable.max_direct_rows; u < iblock->nrows; u++) {
- num_indirect_rows = (H5V_log2_gen(hdr->man_dtable.row_block_size[u]) - first_row_bits) + 1;
- for(v = 0; v < hdr->man_dtable.cparam.width; v++) {
- size_t off = (u * hdr->man_dtable.cparam.width) + v;
-
- if (H5F_addr_defined(iblock->ents[off].addr)) {
- reterr = H5HF_indirect_info(f, dxpl_id, hdr, iblock->ents[off].addr, num_indirect_rows, heap_size);
- if (reterr < 0)
+ num_indirect_rows = (H5V_log2_gen(hdr->man_dtable.row_block_size[u]) - first_row_bits) + 1;
+ for(u = hdr->man_dtable.max_direct_rows; u < iblock->nrows; u++, num_indirect_rows++) {
+ size_t v; /* Local index variable */
+
+ for(v = 0; v < hdr->man_dtable.cparam.width; v++, entry++)
+ if(H5F_addr_defined(iblock->ents[entry].addr))
+ if(H5HF_man_iblock_size(f, dxpl_id, hdr, iblock->ents[entry].addr, num_indirect_rows, heap_size) < 0)
HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, FAIL, "unable to get fractal heap storage info for indirect block")
- } /* end if */
- } /* end for v */
- } /* end for u */
+ } /* end for */
} /* end if */
done:
- if(H5HF_man_iblock_unprotect(iblock, dxpl_id, H5AC__NO_FLAGS_SET, did_protect) < 0)
+ /* Release the indirect block */
+ if(iblock && H5HF_man_iblock_unprotect(iblock, dxpl_id, H5AC__NO_FLAGS_SET, did_protect) < 0)
HGOTO_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release fractal heap indirect block")
+
FUNC_LEAVE_NOAPI(ret_value)
-}
+} /* end H5HF_man_iblock_size() */
+