diff options
Diffstat (limited to 'src/H5HFiter.c')
-rw-r--r-- | src/H5HFiter.c | 230 |
1 files changed, 109 insertions, 121 deletions
diff --git a/src/H5HFiter.c b/src/H5HFiter.c index b01c5e1..50d93c2 100644 --- a/src/H5HFiter.c +++ b/src/H5HFiter.c @@ -26,46 +26,40 @@ /* Module Setup */ /****************/ -#define H5HF_PACKAGE /*suppress error about including H5HFpkg */ +#define H5HF_PACKAGE /*suppress error about including H5HFpkg */ /***********/ /* Headers */ /***********/ -#include "H5private.h" /* Generic Functions */ -#include "H5Eprivate.h" /* Error handling */ -#include "H5HFpkg.h" /* Fractal heaps */ -#include "H5VMprivate.h" /* Vectors and arrays */ +#include "H5private.h" /* Generic Functions */ +#include "H5Eprivate.h" /* Error handling */ +#include "H5HFpkg.h" /* Fractal heaps */ +#include "H5VMprivate.h" /* Vectors and arrays */ /****************/ /* Local Macros */ /****************/ - /******************/ /* Local Typedefs */ /******************/ - /********************/ /* Package Typedefs */ /********************/ - /********************/ /* Local Prototypes */ /********************/ - /*********************/ /* Package Variables */ /*********************/ - /*****************************/ /* Library Private Variables */ /*****************************/ - /*******************/ /* Local Variables */ /*******************/ @@ -73,8 +67,6 @@ /* Declare a free list to manage the H5HF_block_loc_t struct */ H5FL_DEFINE(H5HF_block_loc_t); - - /*------------------------------------------------------------------------- * Function: H5HF_man_iter_init * @@ -106,7 +98,6 @@ H5HF_man_iter_init(H5HF_block_iter_t *biter) FUNC_LEAVE_NOAPI(SUCCEED) } /* end H5HF_man_iter_init() */ - /*------------------------------------------------------------------------- * Function: H5HF_man_iter_start_offset * @@ -122,19 +113,18 @@ H5HF_man_iter_init(H5HF_block_iter_t *biter) *------------------------------------------------------------------------- */ herr_t -H5HF_man_iter_start_offset(H5HF_hdr_t *hdr, hid_t dxpl_id, - H5HF_block_iter_t *biter, hsize_t offset) +H5HF_man_iter_start_offset(H5HF_hdr_t *hdr, hid_t dxpl_id, H5HF_block_iter_t *biter, hsize_t offset) { - H5HF_indirect_t *iblock; /* Indirect block for location context */ - haddr_t iblock_addr; /* Address of indirect block */ - unsigned iblock_nrows; /* # of rows in indirect block */ - H5HF_indirect_t *iblock_parent; /* Parent indirect block of location context */ - unsigned iblock_par_entry; /* Entry within parent indirect block */ - hsize_t curr_offset; /* Current offset, as adjusted */ - unsigned row; /* Current row we are on */ - unsigned col; /* Column in row */ - hbool_t root_block = TRUE; /* Flag to indicate the current block is the root indirect block */ - herr_t ret_value = SUCCEED; /* Return value */ + H5HF_indirect_t *iblock; /* Indirect block for location context */ + haddr_t iblock_addr; /* Address of indirect block */ + unsigned iblock_nrows; /* # of rows in indirect block */ + H5HF_indirect_t *iblock_parent; /* Parent indirect block of location context */ + unsigned iblock_par_entry; /* Entry within parent indirect block */ + hsize_t curr_offset; /* Current offset, as adjusted */ + unsigned row; /* Current row we are on */ + unsigned col; /* Column in row */ + hbool_t root_block = TRUE; /* Flag to indicate the current block is the root indirect block */ + herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_NOAPI_NOINIT @@ -148,30 +138,31 @@ H5HF_man_iter_start_offset(H5HF_hdr_t *hdr, hid_t dxpl_id, HDassert(offset >= hdr->man_dtable.cparam.start_block_size); /* Allocate level structure */ - if(NULL == (biter->curr = H5FL_MALLOC(H5HF_block_loc_t))) - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for direct block free list section") - -/* -1: <Scan down block offsets for dtable rows until find a row >= offset> - <Set current location's row, col, entry & size> - <If row < max_direct_rows> - <Done> - <Else - row > max_direct_rows> - <Create new block level> - <Link new block level into iterator> - <Adjust offset for block offset for row> - <Make new block level the current context> - <Goto 1> - -*/ + if (NULL == (biter->curr = H5FL_MALLOC(H5HF_block_loc_t))) + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, + "memory allocation failed for direct block free list section") + + /* + 1: <Scan down block offsets for dtable rows until find a row >= offset> + <Set current location's row, col, entry & size> + <If row < max_direct_rows> + <Done> + <Else - row > max_direct_rows> + <Create new block level> + <Link new block level into iterator> + <Adjust offset for block offset for row> + <Make new block level the current context> + <Goto 1> + + */ do { - hbool_t did_protect; /* Whether we protected the indirect block or not */ + hbool_t did_protect; /* Whether we protected the indirect block or not */ /* Walk down the rows in the doubling table until we've found the correct row for the next block */ - for(row = 0; row < hdr->man_dtable.max_root_rows; row++) - if((offset >= hdr->man_dtable.row_block_off[row]) && - (offset < hdr->man_dtable.row_block_off[row] + - (hdr->man_dtable.cparam.width * hdr->man_dtable.row_block_size[row]))) + for (row = 0; row < hdr->man_dtable.max_root_rows; row++) + if ((offset >= hdr->man_dtable.row_block_off[row]) && + (offset < hdr->man_dtable.row_block_off[row] + + (hdr->man_dtable.cparam.width * hdr->man_dtable.row_block_size[row]))) break; /* Adjust offset by row offset */ @@ -182,15 +173,15 @@ H5HF_man_iter_start_offset(H5HF_hdr_t *hdr, hid_t dxpl_id, col = (unsigned)(curr_offset / hdr->man_dtable.row_block_size[row]); /* Set the current level's context */ - biter->curr->row = row; - biter->curr->col = col; + biter->curr->row = row; + biter->curr->col = col; biter->curr->entry = (row * hdr->man_dtable.cparam.width) + col; /* Get the context indirect block's information */ - if(root_block) { - iblock_addr = hdr->man_dtable.table_addr; - iblock_nrows = hdr->man_dtable.curr_root_rows; - iblock_parent = NULL; + if (root_block) { + iblock_addr = hdr->man_dtable.table_addr; + iblock_nrows = hdr->man_dtable.curr_root_rows; + iblock_parent = NULL; iblock_par_entry = 0; /* The root block can't go up further... */ @@ -200,49 +191,53 @@ H5HF_man_iter_start_offset(H5HF_hdr_t *hdr, hid_t dxpl_id, root_block = FALSE; } /* end if */ else { - hsize_t child_size; /* Size of new indirect block to create */ + hsize_t child_size; /* Size of new indirect block to create */ /* Retrieve the parent information from the previous context location */ - iblock_parent = biter->curr->up->context; + iblock_parent = biter->curr->up->context; iblock_par_entry = biter->curr->up->entry; /* Look up the address of context indirect block */ iblock_addr = iblock_parent->ents[iblock_par_entry].addr; /* Compute # of rows in context indirect block */ - child_size = hdr->man_dtable.row_block_size[biter->curr->up->row]; + child_size = hdr->man_dtable.row_block_size[biter->curr->up->row]; iblock_nrows = (H5VM_log2_gen(child_size) - hdr->man_dtable.first_row_bits) + 1; } /* end else */ /* Load indirect block for this context location */ - if(NULL == (iblock = H5HF_man_iblock_protect(hdr, dxpl_id, iblock_addr, iblock_nrows, iblock_parent, iblock_par_entry, FALSE, H5AC_WRITE, &did_protect))) + if (NULL == (iblock = H5HF_man_iblock_protect(hdr, dxpl_id, iblock_addr, iblock_nrows, iblock_parent, + iblock_par_entry, FALSE, H5AC_WRITE, &did_protect))) HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect fractal heap indirect block") /* Make indirect block the context for the current location */ biter->curr->context = iblock; /* Hold the indirect block with the location */ - if(H5HF_iblock_incr(biter->curr->context) < 0) - HGOTO_ERROR(H5E_HEAP, H5E_CANTINC, FAIL, "can't increment reference count on shared indirect block") + if (H5HF_iblock_incr(biter->curr->context) < 0) + HGOTO_ERROR(H5E_HEAP, H5E_CANTINC, FAIL, + "can't increment reference count on shared indirect block") /* Release the current indirect block */ - if(H5HF_man_iblock_unprotect(iblock, dxpl_id, H5AC__NO_FLAGS_SET, did_protect) < 0) + if (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") iblock = NULL; /* See if the location falls in a direct block row */ /* Or, if the offset has just filled up a direct or indirect block */ - if(curr_offset == (col * hdr->man_dtable.row_block_size[row]) || row < hdr->man_dtable.max_direct_rows) { + if (curr_offset == (col * hdr->man_dtable.row_block_size[row]) || + row < hdr->man_dtable.max_direct_rows) { HDassert(curr_offset - (col * hdr->man_dtable.row_block_size[row]) == 0); - break; /* Done now */ - } /* end if */ + break; /* Done now */ + } /* end if */ /* Indirect block row */ else { - H5HF_block_loc_t *new_loc; /* Pointer to new block location */ + H5HF_block_loc_t *new_loc; /* Pointer to new block location */ /* Allocate level structure */ - if(NULL == (new_loc = H5FL_MALLOC(H5HF_block_loc_t))) - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for direct block free list section") + if (NULL == (new_loc = H5FL_MALLOC(H5HF_block_loc_t))) + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, + "memory allocation failed for direct block free list section") /* Link new level into iterator */ new_loc->up = biter->curr; @@ -252,8 +247,8 @@ H5HF_man_iter_start_offset(H5HF_hdr_t *hdr, hid_t dxpl_id, /* Make new block the current context */ biter->curr = new_loc; - } /* end else */ - } while(1); /* Breaks out in middle */ + } /* end else */ + } while (1); /* Breaks out in middle */ /* Set flag to indicate block iterator finished initializing */ biter->ready = TRUE; @@ -262,7 +257,6 @@ done: FUNC_LEAVE_NOAPI(ret_value) } /* end H5HF_man_iter_start_offset() */ - /*------------------------------------------------------------------------- * Function: H5HF_man_iter_set_entry * @@ -288,13 +282,12 @@ H5HF_man_iter_set_entry(const H5HF_hdr_t *hdr, H5HF_block_iter_t *biter, unsigne /* Set location context */ biter->curr->entry = entry; - biter->curr->row = entry / hdr->man_dtable.cparam.width; - biter->curr->col = entry % hdr->man_dtable.cparam.width; + biter->curr->row = entry / hdr->man_dtable.cparam.width; + biter->curr->col = entry % hdr->man_dtable.cparam.width; FUNC_LEAVE_NOAPI(SUCCEED) } /* end H5HF_man_iter_set_entry() */ - /*------------------------------------------------------------------------- * Function: H5HF_man_iter_start_entry * @@ -310,11 +303,11 @@ H5HF_man_iter_set_entry(const H5HF_hdr_t *hdr, H5HF_block_iter_t *biter, unsigne *------------------------------------------------------------------------- */ herr_t -H5HF_man_iter_start_entry(H5HF_hdr_t *hdr, H5HF_block_iter_t *biter, - H5HF_indirect_t *iblock, unsigned start_entry) +H5HF_man_iter_start_entry(H5HF_hdr_t *hdr, H5HF_block_iter_t *biter, H5HF_indirect_t *iblock, + unsigned start_entry) { - H5HF_block_loc_t *new_loc = NULL; /* Pointer to new block location */ - herr_t ret_value = SUCCEED; /* Return value */ + H5HF_block_loc_t *new_loc = NULL; /* Pointer to new block location */ + herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_NOAPI_NOINIT @@ -327,18 +320,19 @@ H5HF_man_iter_start_entry(H5HF_hdr_t *hdr, H5HF_block_iter_t *biter, HDassert(iblock); /* Create new location for iterator */ - if(NULL == (new_loc = H5FL_MALLOC(H5HF_block_loc_t))) - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for direct block free list section") + if (NULL == (new_loc = H5FL_MALLOC(H5HF_block_loc_t))) + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, + "memory allocation failed for direct block free list section") /* Set up location context */ - new_loc->entry = start_entry; - new_loc->row = start_entry / hdr->man_dtable.cparam.width; - new_loc->col = start_entry % hdr->man_dtable.cparam.width; + new_loc->entry = start_entry; + new_loc->row = start_entry / hdr->man_dtable.cparam.width; + new_loc->col = start_entry % hdr->man_dtable.cparam.width; new_loc->context = iblock; - new_loc->up = NULL; + new_loc->up = NULL; /* Increment reference count on indirect block */ - if(H5HF_iblock_incr(new_loc->context) < 0) + if (H5HF_iblock_incr(new_loc->context) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTINC, FAIL, "can't increment reference count on shared indirect block") /* Make new location the current location */ @@ -348,13 +342,12 @@ H5HF_man_iter_start_entry(H5HF_hdr_t *hdr, H5HF_block_iter_t *biter, biter->ready = TRUE; done: - if(ret_value < 0 && new_loc) + if (ret_value < 0 && new_loc) new_loc = H5FL_FREE(H5HF_block_loc_t, new_loc); FUNC_LEAVE_NOAPI(ret_value) } /* end H5HF_man_iter_start_entry() */ - /*------------------------------------------------------------------------- * Function: H5HF_man_iter_reset * @@ -372,7 +365,7 @@ done: herr_t H5HF_man_iter_reset(H5HF_block_iter_t *biter) { - herr_t ret_value = SUCCEED; /* Return value */ + herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_NOAPI_NOINIT @@ -382,20 +375,21 @@ H5HF_man_iter_reset(H5HF_block_iter_t *biter) HDassert(biter); /* Free any location contexts that exist */ - if(biter->curr) { - H5HF_block_loc_t *curr_loc; /* Pointer to current block location */ - H5HF_block_loc_t *next_loc; /* Pointer to next block location */ + if (biter->curr) { + H5HF_block_loc_t *curr_loc; /* Pointer to current block location */ + H5HF_block_loc_t *next_loc; /* Pointer to next block location */ /* Free location contexts */ curr_loc = biter->curr; - while(curr_loc) { + while (curr_loc) { /* Get pointer to next node */ next_loc = curr_loc->up; /* If this node is holding an indirect block, release the block */ - if(curr_loc->context) - if(H5HF_iblock_decr(curr_loc->context) < 0) - HGOTO_ERROR(H5E_HEAP, H5E_CANTDEC, FAIL, "can't decrement reference count on shared indirect block") + if (curr_loc->context) + if (H5HF_iblock_decr(curr_loc->context) < 0) + HGOTO_ERROR(H5E_HEAP, H5E_CANTDEC, FAIL, + "can't decrement reference count on shared indirect block") /* Free the current location context */ curr_loc = H5FL_FREE(H5HF_block_loc_t, curr_loc); @@ -415,7 +409,6 @@ done: FUNC_LEAVE_NOAPI(ret_value) } /* end H5HF_man_iter_reset() */ - /*------------------------------------------------------------------------- * Function: H5HF_man_iter_next * @@ -446,12 +439,11 @@ H5HF_man_iter_next(H5HF_hdr_t *hdr, H5HF_block_iter_t *biter, unsigned nentries) biter->curr->entry += nentries; biter->curr->row = biter->curr->entry / hdr->man_dtable.cparam.width; biter->curr->col = biter->curr->entry % hdr->man_dtable.cparam.width; -/* HDassert(biter->curr->row <= biter->curr->context->nrows); */ + /* HDassert(biter->curr->row <= biter->curr->context->nrows); */ FUNC_LEAVE_NOAPI(SUCCEED) } /* end H5HF_man_iter_next() */ - /*------------------------------------------------------------------------- * Function: H5HF_man_iter_up * @@ -468,8 +460,8 @@ H5HF_man_iter_next(H5HF_hdr_t *hdr, H5HF_block_iter_t *biter, unsigned nentries) herr_t H5HF_man_iter_up(H5HF_block_iter_t *biter) { - H5HF_block_loc_t *up_loc; /* Pointer to 'up' block location */ - herr_t ret_value = SUCCEED; /* Return value */ + H5HF_block_loc_t *up_loc; /* Pointer to 'up' block location */ + herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_NOAPI_NOINIT @@ -483,7 +475,7 @@ H5HF_man_iter_up(H5HF_block_iter_t *biter) HDassert(biter->curr->context); /* Release hold on current location's indirect block */ - if(H5HF_iblock_decr(biter->curr->context) < 0) + if (H5HF_iblock_decr(biter->curr->context) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTDEC, FAIL, "can't decrement reference count on shared indirect block") /* Get pointer to location context above this one */ @@ -499,7 +491,6 @@ done: FUNC_LEAVE_NOAPI(ret_value) } /* end H5HF_man_iter_up() */ - /*------------------------------------------------------------------------- * Function: H5HF_man_iter_down * @@ -516,8 +507,8 @@ done: herr_t H5HF_man_iter_down(H5HF_block_iter_t *biter, H5HF_indirect_t *iblock) { - H5HF_block_loc_t *down_loc = NULL; /* Pointer to new 'down' block location */ - herr_t ret_value = SUCCEED; /* Return value */ + H5HF_block_loc_t *down_loc = NULL; /* Pointer to new 'down' block location */ + herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_NOAPI_NOINIT @@ -530,31 +521,31 @@ H5HF_man_iter_down(H5HF_block_iter_t *biter, H5HF_indirect_t *iblock) HDassert(biter->curr->context); /* Create new location to move down to */ - if(NULL == (down_loc = H5FL_MALLOC(H5HF_block_loc_t))) - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for direct block free list section") + if (NULL == (down_loc = H5FL_MALLOC(H5HF_block_loc_t))) + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, + "memory allocation failed for direct block free list section") /* Initialize down location */ - down_loc->row = 0; - down_loc->col = 0; - down_loc->entry = 0; + down_loc->row = 0; + down_loc->col = 0; + down_loc->entry = 0; down_loc->context = iblock; - down_loc->up = biter->curr; + down_loc->up = biter->curr; /* Increment reference count on indirect block */ - if(H5HF_iblock_incr(down_loc->context) < 0) + if (H5HF_iblock_incr(down_loc->context) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTINC, FAIL, "can't increment reference count on shared indirect block") /* Make down location the current location */ biter->curr = down_loc; done: - if(ret_value < 0 && down_loc) + if (ret_value < 0 && down_loc) down_loc = H5FL_FREE(H5HF_block_loc_t, down_loc); FUNC_LEAVE_NOAPI(ret_value) } /* end H5HF_man_iter_down() */ - /*------------------------------------------------------------------------- * Function: H5HF_man_iter_curr * @@ -569,8 +560,8 @@ done: *------------------------------------------------------------------------- */ herr_t -H5HF_man_iter_curr(H5HF_block_iter_t *biter, unsigned *row, unsigned *col, - unsigned *entry, H5HF_indirect_t **block) +H5HF_man_iter_curr(H5HF_block_iter_t *biter, unsigned *row, unsigned *col, unsigned *entry, + H5HF_indirect_t **block) { FUNC_ENTER_NOAPI_NOINIT_NOERR @@ -581,19 +572,18 @@ H5HF_man_iter_curr(H5HF_block_iter_t *biter, unsigned *row, unsigned *col, HDassert(biter->ready); /* Retrieve the information asked for */ - if(row) + if (row) *row = biter->curr->row; - if(col) + if (col) *col = biter->curr->col; - if(entry) + if (entry) *entry = biter->curr->entry; - if(block) + if (block) *block = biter->curr->context; FUNC_LEAVE_NOAPI(SUCCEED) } /* end H5HF_man_iter_curr() */ - /*------------------------------------------------------------------------- * Function: H5HF_man_iter_offset * @@ -610,7 +600,7 @@ H5HF_man_iter_curr(H5HF_block_iter_t *biter, unsigned *row, unsigned *col, herr_t H5HF_man_iter_offset(H5HF_hdr_t *hdr, H5HF_block_iter_t *biter, hsize_t *offset) { - hsize_t curr_offset; /* For computing offset in heap */ + hsize_t curr_offset; /* For computing offset in heap */ FUNC_ENTER_NOAPI_NOINIT_NOERR @@ -633,7 +623,6 @@ H5HF_man_iter_offset(H5HF_hdr_t *hdr, H5HF_block_iter_t *biter, hsize_t *offset) FUNC_LEAVE_NOAPI(SUCCEED) } /* end H5HF_man_iter_offset() */ - /*------------------------------------------------------------------------- * Function: H5HF_man_iter_ready * @@ -659,4 +648,3 @@ H5HF_man_iter_ready(H5HF_block_iter_t *biter) FUNC_LEAVE_NOAPI(biter->ready) } /* end H5HF_man_iter_ready() */ - |