diff options
Diffstat (limited to 'src/H5HFiblock.c')
-rw-r--r-- | src/H5HFiblock.c | 54 |
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() */ + |