diff options
Diffstat (limited to 'src/H5Distore.c')
-rw-r--r-- | src/H5Distore.c | 736 |
1 files changed, 362 insertions, 374 deletions
diff --git a/src/H5Distore.c b/src/H5Distore.c index 328f791..da816af 100644 --- a/src/H5Distore.c +++ b/src/H5Distore.c @@ -1053,6 +1053,7 @@ done: FUNC_LEAVE(ret_value); } + /*------------------------------------------------------------------------- * Function: H5F_istore_preempt * @@ -1064,71 +1065,70 @@ done: * Programmer: Robb Matzke * Thursday, May 21, 1998 * - * Modifications: Pedro Vicente, March 28, 2002 - * Added flush parameter that switches the call to H5F_istore_flush_entry - * The call with FALSE is used by the H5F_istore_prune_by_extent function + * Modifications: + * Pedro Vicente, March 28, 2002 + * Added flush parameter that switches the call to H5F_istore_flush_entry + * The call with FALSE is used by the H5F_istore_prune_by_extent function * *------------------------------------------------------------------------- */ - - static herr_t - H5F_istore_preempt (H5F_t *f, H5F_rdcc_ent_t *ent, hbool_t flush ) - { - H5F_rdcc_t *rdcc = &(f->shared->rdcc); - - FUNC_ENTER (H5F_istore_preempt, FAIL); - - assert(f); - assert(ent); - assert(!ent->locked); - assert(ent->idx<rdcc->nslots); - - if ( flush ) - { - - /* Flush */ - if (H5F_istore_flush_entry(f, ent, TRUE)<0) { - HRETURN_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, - "cannot flush indexed storage buffer"); - } - } - - else - { - - /* Reset, but do not free or remove from list */ - ent->layout = H5O_free(H5O_LAYOUT, ent->layout); - ent->pline = H5O_free(H5O_PLINE, ent->pline); - if(ent->chunk!=NULL) - ent->chunk = H5F_istore_chunk_free(ent->chunk); - - } - - /* Unlink from list */ - if (ent->prev) { - ent->prev->next = ent->next; - } else { - rdcc->head = ent->next; - } - if (ent->next) { - ent->next->prev = ent->prev; - } else { - rdcc->tail = ent->prev; - } - ent->prev = ent->next = NULL; - - /* Remove from cache */ - rdcc->slot[ent->idx] = NULL; - ent->idx = UINT_MAX; - rdcc->nbytes -= ent->chunk_size; - --rdcc->nused; - - /* Free */ - H5FL_FREE(H5F_rdcc_ent_t, ent); - - FUNC_LEAVE (SUCCEED); - } +static herr_t +H5F_istore_preempt(H5F_t *f, H5F_rdcc_ent_t * ent, hbool_t flush) +{ + H5F_rdcc_t *rdcc = &(f->shared->rdcc); + + FUNC_ENTER(H5F_istore_preempt, FAIL); + + assert(f); + assert(ent); + assert(!ent->locked); + assert(ent->idx < rdcc->nslots); + if(flush) { + + /* Flush */ + if(H5F_istore_flush_entry(f, ent, TRUE) < 0) { + HRETURN_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, + "cannot flush indexed storage buffer"); + } + } + + else { + + /* Reset, but do not free or remove from list */ + ent->layout = H5O_free(H5O_LAYOUT, ent->layout); + ent->pline = H5O_free(H5O_PLINE, ent->pline); + if(ent->chunk != NULL) + ent->chunk = H5F_istore_chunk_free(ent->chunk); + + } + + /* Unlink from list */ + if(ent->prev) { + ent->prev->next = ent->next; + } + else { + rdcc->head = ent->next; + } + if(ent->next) { + ent->next->prev = ent->prev; + } + else { + rdcc->tail = ent->prev; + } + ent->prev = ent->next = NULL; + + /* Remove from cache */ + rdcc->slot[ent->idx] = NULL; + ent->idx = UINT_MAX; + rdcc->nbytes -= ent->chunk_size; + --rdcc->nused; + + /* Free */ + H5FL_FREE(H5F_rdcc_ent_t, ent); + + FUNC_LEAVE(SUCCEED); +} /*------------------------------------------------------------------------- @@ -1143,8 +1143,8 @@ done: * Thursday, May 21, 1998 * * Modifications: - * Pedro Vicente, March 28, 2002 - * Added TRUE parameter to the call to H5F_istore_preempt + * Pedro Vicente, March 28, 2002 + * Added TRUE parameter to the call to H5F_istore_preempt * *------------------------------------------------------------------------- */ @@ -1190,8 +1190,8 @@ H5F_istore_flush (H5F_t *f, hbool_t preempt) * Thursday, May 21, 1998 * * Modifications: - * Pedro Vicente, March 28, 2002 - * Added TRUE parameter to the call to H5F_istore_preempt + * Pedro Vicente, March 28, 2002 + * Added TRUE parameter to the call to H5F_istore_preempt * *------------------------------------------------------------------------- */ @@ -1238,8 +1238,8 @@ H5F_istore_dest (H5F_t *f) * Thursday, May 21, 1998 * * Modifications: - * Pedro Vicente, March 28, 2002 - * Added TRUE parameter to the call to H5F_istore_preempt + * Pedro Vicente, March 28, 2002 + * TRUE parameter to the call to H5F_istore_preempt * *------------------------------------------------------------------------- */ @@ -1364,8 +1364,8 @@ H5F_istore_prune (H5F_t *f, size_t size) * The split ratios are passed in as part of the data transfer * property list. * - * Pedro Vicente, March 28, 2002 - * Added TRUE parameter to the call to H5F_istore_preempt + * Pedro Vicente, March 28, 2002 + * TRUE parameter to the call to H5F_istore_preempt *------------------------------------------------------------------------- */ static void * @@ -2498,8 +2498,7 @@ H5F_istore_allocate(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, FUNC_LEAVE(SUCCEED); } - - + /*------------------------------------------------------------------------- * Function: H5F_istore_prune_by_extent * @@ -2600,94 +2599,91 @@ H5F_istore_allocate(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, * *------------------------------------------------------------------------- */ - -herr_t H5F_istore_prune_by_extent( H5F_t *f, H5O_layout_t *layout, H5S_t *space ) +herr_t +H5F_istore_prune_by_extent(H5F_t *f, H5O_layout_t *layout, H5S_t * space) { - H5F_rdcc_t *rdcc = &(f->shared->rdcc); /*raw data chunk cache*/ - H5F_rdcc_ent_t *ent = NULL, *next = NULL; /*cache entry */ - unsigned u; /*counters */ - int found = 0; /*remove this entry */ - H5F_istore_ud1_t udata; /*B-tree pass-through */ - hsize_t curr_dims[H5O_LAYOUT_NDIMS]; /*current dataspace dimensions */ - - FUNC_ENTER( H5F_istore_prune_by_extent, FAIL ); - - /* Check args */ - assert(f); - assert(layout && H5D_CHUNKED==layout->type); - assert(layout->ndims>0 && layout->ndims<=H5O_LAYOUT_NDIMS); - assert(H5F_addr_defined(layout->addr)); - assert(space); - - /* Go get the rank & dimensions */ - if(H5S_get_simple_extent_dims(space, curr_dims, NULL)<0) - HRETURN_ERROR( H5E_DATASET, H5E_CANTGET, FAIL, "can't get dataset dimensions"); - - + H5F_rdcc_t *rdcc = &(f->shared->rdcc); /*raw data chunk cache */ + H5F_rdcc_ent_t *ent = NULL, *next = NULL; /*cache entry */ + unsigned u; /*counters */ + int found = 0; /*remove this entry */ + H5F_istore_ud1_t udata; /*B-tree pass-through */ + hsize_t curr_dims[H5O_LAYOUT_NDIMS]; /*current dataspace dimensions */ + + FUNC_ENTER(H5F_istore_prune_by_extent, FAIL); + + /* Check args */ + assert(f); + assert(layout && H5D_CHUNKED == layout->type); + assert(layout->ndims > 0 && layout->ndims <= H5O_LAYOUT_NDIMS); + assert(H5F_addr_defined(layout->addr)); + assert(space); + + /* Go get the rank & dimensions */ + if(H5S_get_simple_extent_dims(space, curr_dims, NULL) < 0) + HRETURN_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, + "can't get dataset dimensions"); + + /*------------------------------------------------------------------------- * Figure out what chunks are no longer in use for the specified extent * and release them from the linked list raw data cache *------------------------------------------------------------------------- */ - - for ( ent = rdcc->head; ent; ent=next ) - { - next = ent->next; - - found = 0; - for ( u = 0; u < ent->layout->ndims-1; u++ ) - { - if ( (hsize_t)ent->offset[u] > curr_dims[u] ) - { - found = 1; - break; - } - } - - if ( found ) - { + + for(ent = rdcc->head; ent; ent = next) { + next = ent->next; + + found = 0; + for(u = 0; u < ent->layout->ndims - 1; u++) { + if((hsize_t)ent->offset[u] > curr_dims[u]) { + found = 1; + break; + } + } + + if(found) { #if defined (H5F_ISTORE_DEBUG) - HDfputs("cache:remove:[", stdout); - for ( u = 0; u < ent->layout->ndims-1; u++) - { - HDfprintf( stdout, "%s%Hd", u?", ":"", ent->offset[u]); - } - HDfputs("]\n", stdout ); + HDfputs("cache:remove:[", stdout); + for(u = 0; u < ent->layout->ndims - 1; u++) { + HDfprintf(stdout, "%s%Hd", u ? ", " : "", ent->offset[u]); + } + HDfputs("]\n", stdout); #endif - - /* Preempt the entry from the cache, but do not flush it to disk */ - if ( H5F_istore_preempt( f, ent, FALSE ) < 0 ) - { - HRETURN_ERROR(H5E_IO, H5E_CANTINIT, 0, "unable to preempt chunk"); - } - - } - - } - + + /* Preempt the entry from the cache, but do not flush it to disk */ + if(H5F_istore_preempt(f, ent, FALSE) < 0) { + HRETURN_ERROR(H5E_IO, H5E_CANTINIT, 0, + "unable to preempt chunk"); + } + + } + + } + /*------------------------------------------------------------------------- * Check if there are any chunks on the B-tree *------------------------------------------------------------------------- */ - - HDmemset(&udata, 0, sizeof udata); - udata.stream = stdout; - udata.mesg.addr = layout->addr; - udata.mesg.ndims = layout->ndims; - for ( u = 0; u < udata.mesg.ndims; u++ ) - { - udata.mesg.dim[u] = layout->dim[u]; - } - - if ( H5B_prune_by_extent( f, H5B_ISTORE, layout->addr, &udata, curr_dims ) < 0 ) - { - HRETURN_ERROR( H5E_IO, H5E_CANTINIT, 0, "unable to iterate over B-tree" ); - } - - FUNC_LEAVE( SUCCEED ); - + + HDmemset(&udata, 0, sizeof udata); + udata.stream = stdout; + udata.mesg.addr = layout->addr; + udata.mesg.ndims = layout->ndims; + for(u = 0; u < udata.mesg.ndims; u++) { + udata.mesg.dim[u] = layout->dim[u]; + } + + if(H5B_prune_by_extent(f, H5B_ISTORE, layout->addr, &udata, + curr_dims) < 0) { + HRETURN_ERROR(H5E_IO, H5E_CANTINIT, 0, + "unable to iterate over B-tree"); + } + + FUNC_LEAVE(SUCCEED); + } + /*------------------------------------------------------------------------- * Function: H5F_istore_prune_extent * @@ -2705,60 +2701,57 @@ herr_t H5F_istore_prune_by_extent( H5F_t *f, H5O_layout_t *layout, H5S_t *space * *------------------------------------------------------------------------- */ - -static herr_t H5F_istore_prune_extent( H5F_t *f, void *_lt_key, haddr_t addr, void *_udata, - hsize_t *size ) +static herr_t +H5F_istore_prune_extent(H5F_t *f, void *_lt_key, haddr_t addr, void *_udata, + hsize_t *size) { - H5F_istore_ud1_t *bt_udata = (H5F_istore_ud1_t *)_udata; - H5F_istore_key_t *lt_key = (H5F_istore_key_t *)_lt_key; - unsigned u; - int found = 0; - H5F_istore_ud1_t udata; - - /* The LT_KEY is the left key (the onethat describes the chunk). It points to a chunk of - storage that contains the beginning of the logical address space represented by UDATA. - */ - - FUNC_ENTER( H5F_istore_prune_extent, FAIL ); - - /* Figure out what chunks are no longer in use for the specified extent and release them */ - - for ( u = 0; u < bt_udata->mesg.ndims-1; u++ ) - { - if ( (hsize_t)lt_key->offset[u] > size[u] ) - { - found = 1; - break; - } - } - - if ( found ) - { - + H5F_istore_ud1_t *bt_udata = (H5F_istore_ud1_t *)_udata; + H5F_istore_key_t *lt_key = (H5F_istore_key_t *)_lt_key; + unsigned u; + int found = 0; + H5F_istore_ud1_t udata; + + /* The LT_KEY is the left key (the onethat describes the chunk). It points to a chunk of + * storage that contains the beginning of the logical address space represented by UDATA. + */ + + FUNC_ENTER(H5F_istore_prune_extent, FAIL); + + /* Figure out what chunks are no longer in use for the specified extent and release them */ + + for(u = 0; u < bt_udata->mesg.ndims - 1; u++) { + if((hsize_t)lt_key->offset[u] > size[u]) { + found = 1; + break; + } + } + + if(found) { + #if defined (H5F_ISTORE_DEBUG) - HDfputs("b-tree:remove:[", bt_udata->stream); - for ( u = 0; u < bt_udata->mesg.ndims-1; u++) - { - HDfprintf(bt_udata->stream, "%s%Hd", u?", ":"", lt_key->offset[u]); - } - HDfputs("]\n", bt_udata->stream); + HDfputs("b-tree:remove:[", bt_udata->stream); + for(u = 0; u < bt_udata->mesg.ndims - 1; u++) { + HDfprintf(bt_udata->stream, "%s%Hd", u ? ", " : "", + lt_key->offset[u]); + } + HDfputs("]\n", bt_udata->stream); #endif - - HDmemset( &udata, 0, sizeof udata ); - udata.key = *lt_key; - udata.mesg = bt_udata->mesg; - - /* Remove */ - if ( H5B_remove( f, H5B_ISTORE, addr, &udata ) < 0 ) - { - HRETURN_ERROR( H5E_SYM, H5E_CANTINIT, FAIL, "unable to remove entry" ); - } - } - - FUNC_LEAVE( SUCCEED ); -} + HDmemset(&udata, 0, sizeof udata); + udata.key = *lt_key; + udata.mesg = bt_udata->mesg; + + /* Remove */ + if(H5B_remove(f, H5B_ISTORE, addr, &udata) < 0) { + HRETURN_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, + "unable to remove entry"); + } + } + + FUNC_LEAVE(SUCCEED); +} + /*------------------------------------------------------------------------- * Function: H5F_istore_remove * @@ -2777,24 +2770,22 @@ static herr_t H5F_istore_prune_extent( H5F_t *f, void *_lt_key, haddr_t addr, vo * *------------------------------------------------------------------------- */ - -static H5B_ins_t H5F_istore_remove( H5F_t *f, - haddr_t addr, - void *_lt_key /*in,out*/, - hbool_t *lt_key_changed /*out*/, - void UNUSED *_udata /*in,out*/, - void UNUSED *_rt_key /*in,out*/, - hbool_t *rt_key_changed /*out*/) +static H5B_ins_t +H5F_istore_remove(H5F_t *f, haddr_t addr, void *_lt_key /*in,out */ , + hbool_t *lt_key_changed /*out */ , + void UNUSED * _udata /*in,out */ , + void UNUSED * _rt_key /*in,out */ , + hbool_t *rt_key_changed /*out */ ) { - H5F_istore_key_t *lt_key = (H5F_istore_key_t*)_lt_key; - H5FD_free(f->shared->lf, H5FD_MEM_DRAW, addr, (hsize_t)lt_key->nbytes); - *lt_key_changed = FALSE; - *rt_key_changed = FALSE; - return H5B_INS_REMOVE; -} - + H5F_istore_key_t *lt_key = (H5F_istore_key_t *)_lt_key; + H5FD_free(f->shared->lf, H5FD_MEM_DRAW, addr, (hsize_t)lt_key->nbytes); + *lt_key_changed = FALSE; + *rt_key_changed = FALSE; + return H5B_INS_REMOVE; +} + /*------------------------------------------------------------------------- * Function: H5F_istore_initialize_by_extent * @@ -2819,178 +2810,175 @@ static H5B_ins_t H5F_istore_remove( H5F_t *f, * *------------------------------------------------------------------------- */ +herr_t +H5F_istore_initialize_by_extent(H5F_t *f, H5O_layout_t *layout, + H5O_pline_t * pline, H5O_fill_t * fill, H5S_t * space) +{ + hid_t dxpl_id; /*dataset transfer property list */ + uint8_t *chunk = NULL; /*the file chunk */ + unsigned idx_hint = 0; /*input value for H5F_istore_lock */ + hssize_t chunk_offset[H5O_LAYOUT_NDIMS]; /*logical location of the chunks */ + hsize_t idx_cur[H5O_LAYOUT_NDIMS]; /*multi-dimensional counters */ + hsize_t idx_min[H5O_LAYOUT_NDIMS]; + hsize_t idx_max[H5O_LAYOUT_NDIMS]; + hsize_t sub_size[H5O_LAYOUT_NDIMS]; + hsize_t naccessed; /*bytes accessed in chunk */ + hsize_t elm_size; /*size of an element in bytes */ + hsize_t end_chunk; /*chunk position counter */ + hssize_t start[H5O_LAYOUT_NDIMS]; /*starting location of hyperslab */ + hsize_t count[H5O_LAYOUT_NDIMS]; /*element count of hyperslab */ + hsize_t size[H5O_LAYOUT_NDIMS]; /*current size of dimensions */ + H5S_t *space_chunk = NULL; /*dataspace for a chunk */ + hsize_t curr_dims[H5O_LAYOUT_NDIMS]; /*current dataspace dimensions */ + int rank; /*current # of dimensions */ + int i, carry; /*counters */ + unsigned u; + int found = 0; /*initialize this entry */ + + FUNC_ENTER(H5F_istore_initialize_by_extent, FAIL); + + /* Check args */ + assert(f); + assert(layout && H5D_CHUNKED == layout->type); + assert(layout->ndims > 0 && layout->ndims <= H5O_LAYOUT_NDIMS); + assert(H5F_addr_defined(layout->addr)); + assert(space); + assert(pline); + assert(fill); + HDmemset(start, 0, sizeof(start)); + HDmemset(count, 0, sizeof(count)); + + /* Go get the rank & dimensions */ + if((rank = H5S_get_simple_extent_dims(space, curr_dims, NULL)) < 0) + HRETURN_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, + "can't get dataset dimensions"); + + for(i = 0; i < rank; i++) { + size[i] = curr_dims[i]; + } + size[i] = layout->dim[i]; + elm_size = size[i]; + + /* Default dataset transfer property list */ + dxpl_id = H5P_DATASET_XFER_DEFAULT; + + /* Create a data space for a chunk & set the extent */ + if(NULL == (space_chunk = H5S_create(H5S_SIMPLE))) { + HRETURN_ERROR(H5E_DATASPACE, H5E_CANTCREATE, FAIL, + "can't create simple dataspace"); + } + if(H5S_set_extent_simple(space_chunk, (unsigned)rank, layout->dim, + NULL) < 0) { + HRETURN_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, + "can't set dimensions"); + } -herr_t H5F_istore_initialize_by_extent( H5F_t *f, H5O_layout_t *layout, H5O_pline_t *pline, - H5O_fill_t *fill, H5S_t *space ) -{ - hid_t dxpl_id; /*dataset transfer property list*/ - uint8_t *chunk = NULL; /*the file chunk */ - unsigned idx_hint = 0; /*input value for H5F_istore_lock*/ - hssize_t chunk_offset[H5O_LAYOUT_NDIMS]; /*logical location of the chunks */ - hsize_t idx_cur[H5O_LAYOUT_NDIMS]; /*multi-dimensional counters */ - hsize_t idx_min[H5O_LAYOUT_NDIMS]; - hsize_t idx_max[H5O_LAYOUT_NDIMS]; - hsize_t sub_size[H5O_LAYOUT_NDIMS]; - hsize_t naccessed; /*bytes accessed in chunk */ - hsize_t elm_size; /*size of an element in bytes */ - hsize_t end_chunk; /*chunk position counter */ - hssize_t start[H5O_LAYOUT_NDIMS]; /*starting location of hyperslab */ - hsize_t count[H5O_LAYOUT_NDIMS]; /*element count of hyperslab */ - hsize_t size[H5O_LAYOUT_NDIMS]; /*current size of dimensions */ - H5S_t *space_chunk=NULL; /*dataspace for a chunk */ - hsize_t curr_dims[H5O_LAYOUT_NDIMS]; /*current dataspace dimensions */ - int rank; /*current # of dimensions */ - int i, carry; /*counters */ - unsigned u; - int found = 0; /*initialize this entry */ - - FUNC_ENTER( H5F_istore_initialize_by_extent, FAIL ); - - /* Check args */ - assert(f); - assert(layout && H5D_CHUNKED==layout->type); - assert(layout->ndims>0 && layout->ndims<=H5O_LAYOUT_NDIMS); - assert(H5F_addr_defined(layout->addr)); - assert(space); - assert(pline); - assert(fill); - - HDmemset( start, 0, sizeof(start) ); - HDmemset( count, 0, sizeof(count) ); - - /* Go get the rank & dimensions */ - if((rank=H5S_get_simple_extent_dims(space, curr_dims, NULL))<0) - HRETURN_ERROR( H5E_DATASET, H5E_CANTGET, FAIL, "can't get dataset dimensions"); - - for ( i = 0; i < rank; i++ ) - { - size[i] = curr_dims[i]; - } - size[i] = layout->dim[i]; - elm_size = size[i]; - - /* Default dataset transfer property list */ - dxpl_id = H5P_DATASET_XFER_DEFAULT; - - /* Create a data space for a chunk & set the extent */ - if(NULL==(space_chunk=H5S_create(H5S_SIMPLE))) { - HRETURN_ERROR (H5E_DATASPACE, H5E_CANTCREATE, FAIL, - "can't create simple dataspace"); - } - if(H5S_set_extent_simple(space_chunk,(unsigned)rank,layout->dim,NULL)<0) { - HRETURN_ERROR (H5E_DATASPACE, H5E_CANTINIT, FAIL, - "can't set dimensions"); - } - /* * Set up multi-dimensional counters (idx_min, idx_max, and idx_cur) and * loop through the chunks copying each chunk from the application to the * chunk cache. */ - for ( u = 0; u < layout->ndims; u++) - { - idx_min[u] = 0; - idx_max[u] = (size[u]-1) / layout->dim[u] + 1; - idx_cur[u] = idx_min[u]; - } - - /* Loop over all chunks */ - while ( 1 ) - { - - for ( u = 0, naccessed=1; u < layout->ndims; u++ ) - { - /* The location and size of the chunk being accessed */ - chunk_offset[u] = idx_cur[u] * (hssize_t)(layout->dim[u]); - sub_size[u] = MIN((idx_cur[u]+1)*layout->dim[u],size[u]) - chunk_offset[u]; - naccessed *= sub_size[u]; - } - - /* - Figure out what chunks have to be initialized. These are the chunks where the database - extent boundary is within the chunk - */ - - for ( u = 0, found = 0; u < layout->ndims-1; u++ ) - { - end_chunk = chunk_offset[u] + layout->dim[u]; - if ( end_chunk > size[u] ) - { - found = 1; - break; - } - } - - if ( found ) - { - - if (NULL==(chunk=H5F_istore_lock( f, dxpl_id, layout, pline, fill, chunk_offset, FALSE, &idx_hint))) - { - HRETURN_ERROR (H5E_IO, H5E_WRITEERROR, FAIL, "unable to read raw data chunk"); - } - - if ( H5S_select_all( space_chunk ) < 0 ) - { - HRETURN_ERROR (H5E_IO, H5E_WRITEERROR, FAIL, "unable to select space"); - } - - for ( i = 0; i < rank; i++ ) - { - count[i] = MIN( (idx_cur[i]+1)*layout->dim[i], size[i]-chunk_offset[i] ); - } - + for(u = 0; u < layout->ndims; u++) { + idx_min[u] = 0; + idx_max[u] = (size[u] - 1) / layout->dim[u] + 1; + idx_cur[u] = idx_min[u]; + } + + /* Loop over all chunks */ + while(1) { + + for(u = 0, naccessed = 1; u < layout->ndims; u++) { + /* The location and size of the chunk being accessed */ + chunk_offset[u] = idx_cur[u] * (hssize_t)(layout->dim[u]); + sub_size[u] = + MIN((idx_cur[u] + 1) * layout->dim[u], + size[u]) - chunk_offset[u]; + naccessed *= sub_size[u]; + } + + /* + * Figure out what chunks have to be initialized. These are the chunks where the database + * extent boundary is within the chunk + */ + + for(u = 0, found = 0; u < layout->ndims - 1; u++) { + end_chunk = chunk_offset[u] + layout->dim[u]; + if(end_chunk > size[u]) { + found = 1; + break; + } + } + + if(found) { + + if(NULL == (chunk = + H5F_istore_lock(f, dxpl_id, layout, pline, fill, + chunk_offset, FALSE, &idx_hint))) { + HRETURN_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, + "unable to read raw data chunk"); + } + + if(H5S_select_all(space_chunk) < 0) { + HRETURN_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, + "unable to select space"); + } + + for(i = 0; i < rank; i++) { + count[i] = + MIN((idx_cur[i] + 1) * layout->dim[i], + size[i] - chunk_offset[i]); + } + #if defined (H5F_ISTORE_DEBUG) - HDfputs("cache:initialize:offset:[", stdout); - for ( u = 0; u < layout->ndims-1; u++) - { - HDfprintf( stdout, "%s%Hd", u?", ":"", chunk_offset[u]); - } - HDfputs("]", stdout ); - HDfputs(":count:[", stdout); - for ( u = 0; u < layout->ndims-1; u++) - { - HDfprintf( stdout, "%s%Hd", u?", ":"", count[u]); - } - HDfputs("]\n", stdout ); + HDfputs("cache:initialize:offset:[", stdout); + for(u = 0; u < layout->ndims - 1; u++) { + HDfprintf(stdout, "%s%Hd", u ? ", " : "", chunk_offset[u]); + } + HDfputs("]", stdout); + HDfputs(":count:[", stdout); + for(u = 0; u < layout->ndims - 1; u++) { + HDfprintf(stdout, "%s%Hd", u ? ", " : "", count[u]); + } + HDfputs("]\n", stdout); #endif - - if ( H5S_select_hyperslab( space_chunk, H5S_SELECT_NOTB, start, NULL, count, NULL)<0) - { - HRETURN_ERROR (H5E_IO, H5E_WRITEERROR, FAIL, "unable to select hyperslab"); - } - - /* Fill the selection in the memory buffer */ - if ( H5S_select_fill( fill->buf, fill->size, space_chunk, chunk ) < 0 ) - { - HRETURN_ERROR(H5E_DATASET, H5E_CANTENCODE, FAIL, "filling selection failed"); - } - - if (H5F_istore_unlock(f, dxpl_id, layout, pline, TRUE, chunk_offset, &idx_hint, chunk, (size_t)naccessed)<0) - { - HRETURN_ERROR (H5E_IO, H5E_WRITEERROR, FAIL, "unable to unlock raw data chunk"); - } - - } /*found*/ - - - /* Increment indices */ - for ( i = layout->ndims-1, carry=1; i >= 0 && carry; --i) - { - if (++idx_cur[i] >= idx_max[i]) - idx_cur[i] = idx_min[i]; - else - carry = 0; - } - if (carry) - break; - - } - - - if(space_chunk) - H5S_close( space_chunk); - - FUNC_LEAVE( SUCCEED ); -} + if(H5S_select_hyperslab(space_chunk, H5S_SELECT_NOTB, start, NULL, + count, NULL) < 0) { + HRETURN_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, + "unable to select hyperslab"); + } + + /* Fill the selection in the memory buffer */ + if(H5S_select_fill(fill->buf, fill->size, space_chunk, chunk) < 0) { + HRETURN_ERROR(H5E_DATASET, H5E_CANTENCODE, FAIL, + "filling selection failed"); + } + + if(H5F_istore_unlock(f, dxpl_id, layout, pline, TRUE, + chunk_offset, &idx_hint, chunk, + (size_t)naccessed) < 0) { + HRETURN_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, + "unable to unlock raw data chunk"); + } + + } /*found */ + + + /* Increment indices */ + for(i = layout->ndims - 1, carry = 1; i >= 0 && carry; --i) { + if(++idx_cur[i] >= idx_max[i]) + idx_cur[i] = idx_min[i]; + else + carry = 0; + } + if(carry) + break; + + } + + if(space_chunk) + H5S_close(space_chunk); + + FUNC_LEAVE(SUCCEED); +} |