diff options
Diffstat (limited to 'src/H5Fistore.c')
-rw-r--r-- | src/H5Fistore.c | 323 |
1 files changed, 143 insertions, 180 deletions
diff --git a/src/H5Fistore.c b/src/H5Fistore.c index 54b2fd2..1c2b137 100644 --- a/src/H5Fistore.c +++ b/src/H5Fistore.c @@ -1774,7 +1774,7 @@ H5F_istore_unlock(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, */ herr_t H5F_istore_read(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, - const H5O_pline_t *pline, const H5O_fill_t *fill, + H5P_genplist_t *dc_plist, const hsize_t size_m[], const hssize_t offset_m[], const hssize_t offset_f[], const hsize_t size[], void *buf) { @@ -1792,6 +1792,9 @@ H5F_istore_read(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, unsigned idx_hint=0; /*cache index hint */ hsize_t chunk_size; /* Bytes in chunk */ haddr_t chunk_addr; /* Chunk address on disk */ + H5O_pline_t pline; /* I/O pipeline information */ + H5O_fill_t fill; /* Fill value information */ + herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER(H5F_istore_read, FAIL); @@ -1806,6 +1809,12 @@ H5F_istore_read(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, assert(size); assert(buf); + /* Get necessary properties from property list */ + if(H5P_get(dc_plist, H5D_CRT_FILL_VALUE_NAME, &fill) < 0) + HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get fill value"); + if(H5P_get(dc_plist, H5D_CRT_DATA_PIPELINE_NAME, &pline) < 0) + HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get data pipeline"); + /* Compute chunk size */ for (u=0, chunk_size=1; u<layout->ndims; u++) chunk_size *= layout->dim[u]; @@ -1832,7 +1841,8 @@ H5F_istore_read(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, } /* Loop over all chunks */ - while (1) { + carry=0; + while (carry==0) { for (u=0, naccessed=1; u<layout->ndims; u++) { /* The location and size of the chunk being accessed */ assert(layout->dim[u] < HSSIZET_MAX); @@ -1860,7 +1870,7 @@ H5F_istore_read(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, * for the chunk has been defined, then don't load the chunk into the * cache, just read the data from it directly. */ - if ((chunk_size>f->shared->rdcc_nbytes && pline->nfilters==0 && + if ((chunk_size>f->shared->rdcc_nbytes && pline.nfilters==0 && chunk_addr!=HADDR_UNDEF) #ifdef H5_HAVE_PARALLEL @@ -1876,8 +1886,8 @@ H5F_istore_read(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, #ifdef H5_HAVE_PARALLEL /* Additional sanity checks when operating in parallel */ - if (chunk_addr==HADDR_UNDEF || pline->nfilters>0) - HRETURN_ERROR (H5E_IO, H5E_WRITEERROR, FAIL, "unable to locate raw data chunk"); + if (chunk_addr==HADDR_UNDEF || pline.nfilters>0) + HGOTO_ERROR (H5E_IO, H5E_WRITEERROR, FAIL, "unable to locate raw data chunk"); #endif /* H5_HAVE_PARALLEL */ /* @@ -1890,29 +1900,24 @@ H5F_istore_read(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, for (u=l.ndims; u-- > 0; /*void*/) l.dim[u] = layout->dim[u]; l.addr = chunk_addr; - if (H5F_arr_read(f, H5P_DATASET_XFER_DEFAULT, &l, pline, fill, NULL/*no efl*/, + if (H5F_arr_read(f, H5P_DATASET_XFER_DEFAULT, &l, dc_plist, sub_size, size_m, sub_offset_m, offset_wrt_chunk, buf)<0) - HRETURN_ERROR (H5E_IO, H5E_READERROR, FAIL, "unable to read raw data from file"); + HGOTO_ERROR (H5E_IO, H5E_READERROR, FAIL, "unable to read raw data from file"); } /* end if */ else { /* * Lock the chunk, transfer data to the application, then unlock * the chunk. */ - if (NULL==(chunk=H5F_istore_lock(f, dxpl_id, layout, pline, fill, - chunk_offset, FALSE, &idx_hint))) { - HRETURN_ERROR(H5E_IO, H5E_READERROR, FAIL, - "unable to read raw data chunk"); - } + if (NULL==(chunk=H5F_istore_lock(f, dxpl_id, layout, &pline, &fill, + chunk_offset, FALSE, &idx_hint))) + HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "unable to read raw data chunk"); H5V_hyper_copy(layout->ndims, sub_size, size_m, sub_offset_m, (void*)buf, layout->dim, offset_wrt_chunk, chunk); H5_CHECK_OVERFLOW(naccessed,hsize_t,size_t); - if (H5F_istore_unlock(f, dxpl_id, layout, pline, FALSE, - chunk_offset, &idx_hint, chunk, - (size_t)naccessed)<0) { - HRETURN_ERROR(H5E_IO, H5E_READERROR, FAIL, - "unable to unlock raw data chunk"); - } + if (H5F_istore_unlock(f, dxpl_id, layout, &pline, FALSE, + chunk_offset, &idx_hint, chunk, (size_t)naccessed)<0) + HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "unable to unlock raw data chunk"); } /* end else */ /* Increment indices */ @@ -1922,10 +1927,10 @@ H5F_istore_read(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, else carry = 0; } - if (carry) - break; } - FUNC_LEAVE(SUCCEED); + +done: + FUNC_LEAVE(ret_value); } @@ -1951,7 +1956,7 @@ H5F_istore_read(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, */ herr_t H5F_istore_write(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, - const H5O_pline_t *pline, const H5O_fill_t *fill, + H5P_genplist_t *dc_plist, const hsize_t size_m[], const hssize_t offset_m[], const hssize_t offset_f[], const hsize_t size[], const void *buf) @@ -1969,6 +1974,9 @@ H5F_istore_write(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, unsigned idx_hint=0; hsize_t chunk_size, naccessed; haddr_t chunk_addr; /* Chunk address on disk */ + H5O_pline_t pline; /* I/O pipeline information */ + H5O_fill_t fill; /* Fill value information */ + herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER(H5F_istore_write, FAIL); @@ -1983,6 +1991,12 @@ H5F_istore_write(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, assert(size); assert(buf); + /* Get necessary properties from property list */ + if(H5P_get(dc_plist, H5D_CRT_FILL_VALUE_NAME, &fill) < 0) + HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get fill value"); + if(H5P_get(dc_plist, H5D_CRT_DATA_PIPELINE_NAME, &pline) < 0) + HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get data pipeline"); + /* Compute chunk size */ for (u=0, chunk_size=1; u<layout->ndims; u++) chunk_size *= layout->dim[u]; @@ -2010,7 +2024,8 @@ H5F_istore_write(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, /* Loop over all chunks */ - while (1) { + carry=0; + while (carry==0) { for (u=0, naccessed=1; u<layout->ndims; u++) { /* The location and size of the chunk being accessed */ assert(layout->dim[u] < HSSIZET_MAX); @@ -2038,7 +2053,7 @@ H5F_istore_write(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, * for the chunk has been defined, then don't load the chunk into the * cache, just write the data to it directly. */ - if ((chunk_size>f->shared->rdcc_nbytes && pline->nfilters==0 && + if ((chunk_size>f->shared->rdcc_nbytes && pline.nfilters==0 && chunk_addr!=HADDR_UNDEF) #ifdef H5_HAVE_PARALLEL @@ -2054,8 +2069,8 @@ H5F_istore_write(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, #ifdef H5_HAVE_PARALLEL /* Additional sanity check when operating in parallel */ - if (chunk_addr==HADDR_UNDEF || pline->nfilters>0) - HRETURN_ERROR (H5E_IO, H5E_WRITEERROR, FAIL, "unable to locate raw data chunk"); + if (chunk_addr==HADDR_UNDEF || pline.nfilters>0) + HGOTO_ERROR (H5E_IO, H5E_WRITEERROR, FAIL, "unable to locate raw data chunk"); #endif /* H5_HAVE_PARALLEL */ /* @@ -2068,24 +2083,24 @@ H5F_istore_write(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, for (u=l.ndims; u-- > 0; /*void*/) l.dim[u] = layout->dim[u]; l.addr = chunk_addr; - if (H5F_arr_write(f, H5P_DATASET_XFER_DEFAULT, &l, pline, fill, NULL/*no efl*/, + if (H5F_arr_write(f, H5P_DATASET_XFER_DEFAULT, &l, dc_plist, sub_size, size_m, sub_offset_m, offset_wrt_chunk, buf)<0) - HRETURN_ERROR (H5E_IO, H5E_WRITEERROR, FAIL, "unable to write raw data to file"); + HGOTO_ERROR (H5E_IO, H5E_WRITEERROR, FAIL, "unable to write raw data to file"); } /* end if */ else { /* * Lock the chunk, copy from application to chunk, then unlock the * chunk. */ - if (NULL==(chunk=H5F_istore_lock(f, dxpl_id, layout, pline, fill, + if (NULL==(chunk=H5F_istore_lock(f, dxpl_id, layout, &pline, &fill, chunk_offset, (hbool_t)(naccessed==chunk_size), &idx_hint))) - HRETURN_ERROR (H5E_IO, H5E_WRITEERROR, FAIL, "unable to read raw data chunk"); + HGOTO_ERROR (H5E_IO, H5E_WRITEERROR, FAIL, "unable to read raw data chunk"); H5V_hyper_copy(layout->ndims, sub_size, layout->dim, offset_wrt_chunk, chunk, size_m, sub_offset_m, buf); H5_CHECK_OVERFLOW(naccessed,hsize_t,size_t); - if (H5F_istore_unlock(f, dxpl_id, layout, pline, TRUE, + 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, "uanble to unlock raw data chunk"); + HGOTO_ERROR (H5E_IO, H5E_WRITEERROR, FAIL, "uanble to unlock raw data chunk"); } /* end else */ /* Increment indices */ @@ -2095,11 +2110,10 @@ H5F_istore_write(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, else carry = 0; } - if (carry) - break; - } + } /* end while */ - FUNC_LEAVE(SUCCEED); +done: + FUNC_LEAVE(ret_value); } @@ -2403,33 +2417,34 @@ done: */ herr_t H5F_istore_allocate(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, - const hsize_t *space_dim, const H5O_pline_t *pline, - const H5O_fill_t *fill) + const hsize_t *space_dim, H5P_genplist_t *dc_plist) { int i, carry; - unsigned u; - hssize_t chunk_offset[H5O_LAYOUT_NDIMS]; - uint8_t *chunk=NULL; - unsigned idx_hint=0; - hsize_t chunk_size; -#ifdef AKC - H5F_istore_ud1_t udata; -#endif + unsigned u; + hssize_t chunk_offset[H5O_LAYOUT_NDIMS]; + uint8_t *chunk=NULL; + unsigned idx_hint=0; + hsize_t chunk_size; + H5O_pline_t pline; /* I/O pipeline information */ + H5O_fill_t fill; /* Fill value information */ + herr_t ret_value=SUCCEED; /* Return value */ FUNC_ENTER(H5F_istore_allocate, FAIL); -#ifdef AKC - printf("Enter %s:\n", FUNC); -#endif /* Check args */ assert(f); assert(space_dim); - assert(pline); assert(layout && H5D_CHUNKED==layout->type); assert(layout->ndims>0 && layout->ndims<=H5O_LAYOUT_NDIMS); assert(H5F_addr_defined(layout->addr)); + /* Get necessary properties from property list */ + if(H5P_get(dc_plist, H5D_CRT_FILL_VALUE_NAME, &fill) < 0) + HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get fill value"); + if(H5P_get(dc_plist, H5D_CRT_DATA_PIPELINE_NAME, &pline) < 0) + HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get data pipeline"); + /* * Setup indice to go through all chunks. (Future improvement * should allocate only chunks that have no file space assigned yet. @@ -2437,65 +2452,37 @@ H5F_istore_allocate(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, for (u=0, chunk_size=1; u<layout->ndims; u++) { chunk_offset[u]=0; chunk_size *= layout->dim[u]; - } + } /* end for */ /* Loop over all chunks */ - while (1) { - -#ifdef AKC - printf("Checking allocation for chunk( "); - for (u=0; u<layout->ndims; u++){ - printf("%ld ", chunk_offset[u]); - } - printf(")\n"); -#endif -#ifdef NO - if (H5F_istore_get_addr(f, layout, chunk_offset, &udata)<0) { -#endif - /* No file space assigned yet. Allocate it. */ - /* The following needs improvement like calling the */ - /* allocation directly rather than indirectly using the */ - /* allocation effect in the unlock process. */ + carry=0; + while (carry==0) { + /* No file space assigned yet. Allocate it. */ + /* The following needs improvement like calling the */ + /* allocation directly rather than indirectly using the */ + /* allocation effect in the unlock process. */ -#ifdef AKC - printf("need allocation\n"); -#endif - /* - * Lock the chunk, copy from application to chunk, then unlock the - * chunk. - */ + /* + * Lock the chunk, copy from application to chunk, then unlock the + * chunk. + */ #ifdef H5_HAVE_PARALLEL - /* rky 981207 Serialize access to this critical region. */ - if (SUCCEED!= H5FD_mpio_wait_for_left_neighbor(f->shared->lf)) { - HRETURN_ERROR (H5E_IO, H5E_WRITEERROR, FAIL, - "unable to lock the data chunk"); - } + /* rky 981207 Serialize access to this critical region. */ + if (SUCCEED!= H5FD_mpio_wait_for_left_neighbor(f->shared->lf)) + HGOTO_ERROR (H5E_IO, H5E_WRITEERROR, FAIL, "unable to lock the data chunk"); #endif - 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"); - } - H5_CHECK_OVERFLOW(chunk_size,hsize_t,size_t); - if (H5F_istore_unlock(f, dxpl_id, layout, pline, TRUE, - chunk_offset, &idx_hint, chunk, (size_t)chunk_size)<0) { - HRETURN_ERROR (H5E_IO, H5E_WRITEERROR, FAIL, - "uanble to unlock raw data chunk"); - } + if (NULL==(chunk=H5F_istore_lock(f, dxpl_id, layout, &pline, + &fill, chunk_offset, FALSE, &idx_hint))) + HGOTO_ERROR (H5E_IO, H5E_WRITEERROR, FAIL, "unable to read raw data chunk"); + + H5_CHECK_OVERFLOW(chunk_size,hsize_t,size_t); + if (H5F_istore_unlock(f, dxpl_id, layout, &pline, TRUE, + chunk_offset, &idx_hint, chunk, (size_t)chunk_size)<0) + HGOTO_ERROR (H5E_IO, H5E_WRITEERROR, FAIL, "uanble to unlock raw data chunk"); #ifdef H5_HAVE_PARALLEL - if (SUCCEED!= H5FD_mpio_signal_right_neighbor(f->shared->lf)) { - HRETURN_ERROR (H5E_IO, H5E_WRITEERROR, FAIL, - "unable to unlock the data chunk"); - } -#endif -#ifdef NO - } else { -#ifdef AKC - printf("NO need for allocation\n"); - HDfprintf(stdout, "udata.addr=%a\n", udata.addr); -#endif - } + if (SUCCEED!= H5FD_mpio_signal_right_neighbor(f->shared->lf)) + HGOTO_ERROR (H5E_IO, H5E_WRITEERROR, FAIL, "unable to unlock the data chunk"); #endif /* Increment indices */ @@ -2506,10 +2493,8 @@ H5F_istore_allocate(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, } else { carry = 0; } - } - if (carry) - break; - } + } /* end for */ + } /* end while */ #ifdef H5_HAVE_PARALLEL /* @@ -2522,12 +2507,12 @@ H5F_istore_allocate(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, * removed, when H5D_init_storage is changed to call H5MF_alloc directly * to allocate space, instead of calling H5F_istore_unlock. */ - if (MPI_Barrier(H5FD_mpio_communicator(f->shared->lf))) { - HRETURN_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_Barrier failed"); - } + if (MPI_Barrier(H5FD_mpio_communicator(f->shared->lf))) + HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_Barrier failed"); #endif - FUNC_LEAVE(SUCCEED); +done: + FUNC_LEAVE(ret_value); } @@ -2632,7 +2617,7 @@ 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) +H5F_istore_prune_by_extent(H5F_t *f, const H5O_layout_t *layout, const H5S_t * space) { H5F_rdcc_t *rdcc = &(f->shared->rdcc); /*raw data chunk cache */ H5F_rdcc_ent_t *ent = NULL, *next = NULL; /*cache entry */ @@ -2652,16 +2637,13 @@ H5F_istore_prune_by_extent(H5F_t *f, H5O_layout_t *layout, H5S_t * 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"); - + 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; @@ -2830,8 +2812,8 @@ H5F_istore_remove(H5F_t *f, haddr_t addr, void *_lt_key /*in,out */ , *------------------------------------------------------------------------- */ 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) +H5F_istore_initialize_by_extent(H5F_t *f, const H5O_layout_t *layout, + H5P_genplist_t *dc_plist, const H5S_t * space) { hid_t dxpl_id; /*dataset transfer property list */ uint8_t *chunk = NULL; /*the file chunk */ @@ -2853,6 +2835,9 @@ H5F_istore_initialize_by_extent(H5F_t *f, H5O_layout_t *layout, int i, carry; /*counters */ unsigned u; int found = 0; /*initialize this entry */ + H5O_pline_t pline; /* I/O pipeline information */ + H5O_fill_t fill; /* Fill value information */ + herr_t ret_value=SUCCEED; /* Return value */ FUNC_ENTER(H5F_istore_initialize_by_extent, FAIL); @@ -2862,20 +2847,24 @@ H5F_istore_initialize_by_extent(H5F_t *f, H5O_layout_t *layout, assert(layout->ndims > 0 && layout->ndims <= H5O_LAYOUT_NDIMS); assert(H5F_addr_defined(layout->addr)); assert(space); - assert(pline); - assert(fill); + /* Get necessary properties from property list */ + if(H5P_get(dc_plist, H5D_CRT_FILL_VALUE_NAME, &fill) < 0) + HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get fill value"); + if(H5P_get(dc_plist, H5D_CRT_DATA_PIPELINE_NAME, &pline) < 0) + HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get data pipeline"); + + /* Reset start & count arrays */ 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"); + HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get dataset dimensions"); - for(i = 0; i < rank; i++) { + /* Copy current dimensions */ + for(i = 0; i < rank; i++) size[i] = curr_dims[i]; - } size[i] = layout->dim[i]; elm_size = size[i]; @@ -2883,15 +2872,10 @@ H5F_istore_initialize_by_extent(H5F_t *f, H5O_layout_t *layout, 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"); - } + if(NULL == (space_chunk = H5S_create(H5S_SIMPLE))) + HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCREATE, FAIL, "can't create simple dataspace"); + if(H5S_set_extent_simple(space_chunk, (unsigned)rank, layout->dim, NULL) < 0) + HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, "can't set dimensions"); /* * Set up multi-dimensional counters (idx_min, idx_max, and idx_cur) and @@ -2902,87 +2886,68 @@ H5F_istore_initialize_by_extent(H5F_t *f, H5O_layout_t *layout, idx_min[u] = 0; idx_max[u] = (size[u] - 1) / layout->dim[u] + 1; idx_cur[u] = idx_min[u]; - } + } /* end for */ /* Loop over all chunks */ - while(1) { + carry=0; + while(carry==0) { 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], + sub_size[u] = MIN((idx_cur[u] + 1) * layout->dim[u], size[u]) - chunk_offset[u]; naccessed *= sub_size[u]; - } + } /* end for */ /* * 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; } - } + } /* end for */ 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(NULL == (chunk = H5F_istore_lock(f, dxpl_id, layout, &pline, &fill, + chunk_offset, FALSE, &idx_hint))) + HGOTO_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"); - } + if(H5S_select_all(space_chunk) < 0) + HGOTO_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(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++) { + 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++) { + 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"); - } + count, NULL) < 0) + HGOTO_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"); - } + if(H5S_select_fill(fill.buf, fill.size, space_chunk, chunk) < 0) + HGOTO_ERROR(H5E_DATASET, H5E_CANTENCODE, FAIL, "filling selection failed"); - } /*found */ + if(H5F_istore_unlock(f, dxpl_id, layout, &pline, TRUE, + chunk_offset, &idx_hint, chunk, (size_t)naccessed) < 0) + HGOTO_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) { @@ -2990,14 +2955,12 @@ H5F_istore_initialize_by_extent(H5F_t *f, H5O_layout_t *layout, idx_cur[i] = idx_min[i]; else carry = 0; - } - if(carry) - break; - - } + } /* end for */ + } /* end while */ +done: if(space_chunk) H5S_close(space_chunk); - FUNC_LEAVE(SUCCEED); + FUNC_LEAVE(ret_value); } |