summaryrefslogtreecommitdiffstats
path: root/src/H5Fistore.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/H5Fistore.c')
-rw-r--r--src/H5Fistore.c431
1 files changed, 151 insertions, 280 deletions
diff --git a/src/H5Fistore.c b/src/H5Fistore.c
index 7f8d7e1..9629963 100644
--- a/src/H5Fistore.c
+++ b/src/H5Fistore.c
@@ -1685,246 +1685,154 @@ H5F_istore_unlock(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout,
/*-------------------------------------------------------------------------
- * Function: H5F_istore_read
+ * Function: H5F_istore_readvv
*
* Purpose: Reads a multi-dimensional buffer from (part of) an indexed raw
* storage array.
*
* Return: Non-negative on success/Negative on failure
*
- * Programmer: Robb Matzke
- * Wednesday, October 15, 1997
+ * Programmer: Quincey Koziol
+ * Wednesday, May 7, 2003
*
* Modifications:
- * Robb Matzke, 1999-08-02
- * The data transfer property list is passed as an object ID
- * since that's how the virtual file layer wants it.
*
- * Quincey Koziol, 2002-04-02
- * Enable hyperslab I/O into memory buffer
*-------------------------------------------------------------------------
*/
-herr_t
-H5F_istore_read(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout,
- 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)
+ssize_t
+H5F_istore_readvv(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout,
+ H5P_genplist_t *dc_plist, hssize_t chunk_coords[],
+ size_t chunk_max_nseq, size_t *chunk_curr_seq, size_t chunk_len_arr[], hsize_t chunk_offset_arr[],
+ size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_len_arr[], hsize_t mem_offset_arr[],
+ void *buf)
{
- hsize_t idx_cur[H5O_LAYOUT_NDIMS];
- hsize_t idx_min[H5O_LAYOUT_NDIMS];
- hsize_t idx_max[H5O_LAYOUT_NDIMS];
- hsize_t sub_size[H5O_LAYOUT_NDIMS];
- hssize_t offset_wrt_chunk[H5O_LAYOUT_NDIMS];
- hssize_t sub_offset_m[H5O_LAYOUT_NDIMS];
- hssize_t chunk_offset[H5O_LAYOUT_NDIMS];
- int i, carry;
- unsigned u;
- hsize_t naccessed; /*bytes accessed in chnk*/
- uint8_t *chunk=NULL; /*ptr to a chunk buffer */
- unsigned idx_hint=0; /*cache index hint */
- hsize_t chunk_size; /* Bytes in chunk */
+ hsize_t chunk_size; /* Chunk size, in bytes */
haddr_t chunk_addr; /* Chunk address on disk */
+ hssize_t chunk_coords_in_elmts[H5O_LAYOUT_NDIMS];
H5O_pline_t pline; /* I/O pipeline information */
- H5O_fill_t fill; /* Fill value information */
- herr_t ret_value = SUCCEED; /* Return value */
-
- FUNC_ENTER_NOAPI(H5F_istore_read, FAIL);
+ size_t u; /* Local index variables */
+ ssize_t ret_value; /* Return value */
+
+ FUNC_ENTER_NOAPI(H5F_istore_readvv, 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(size_m);
- assert(offset_m);
- assert(offset_f);
- assert(size);
+ assert(chunk_len_arr);
+ assert(chunk_offset_arr);
+ assert(mem_len_arr);
+ assert(mem_offset_arr);
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];
-
+
#ifndef NDEBUG
- for (u=0; u<layout->ndims; u++) {
- assert(offset_f[u]>=0); /*negative offsets not supported*/
- assert(offset_m[u]>=0); /*negative offsets not supported*/
- assert(size[u]<SIZET_MAX);
- assert(offset_m[u]+(hssize_t)size[u]<=(hssize_t)size_m[u]);
- assert(layout->dim[u]>0);
- }
+ for (u=0; u<layout->ndims; u++)
+ assert(chunk_coords[u]>=0); /*negative coordinates not supported (yet) */
#endif
+
+ for (u=0; u<layout->ndims; u++)
+ chunk_coords_in_elmts[u] = chunk_coords[u] * (hssize_t)(layout->dim[u]);
+
+ /* Get the address of this chunk on disk */
+ chunk_addr=H5F_istore_get_addr(f, dxpl_id, layout, chunk_coords_in_elmts);
/*
- * Set up multi-dimensional counters (idx_min, idx_max, and idx_cur) and
- * loop through the chunks copying each to its final destination in the
- * application buffer.
+ * If the chunk is too large to load into the cache and it has no
+ * filters in the pipeline (i.e. not compressed) and if the address
+ * for the chunk has been defined, then don't load the chunk into the
+ * cache, just write the data to it directly.
*/
- for (u=0; u<layout->ndims; u++) {
- idx_min[u] = offset_f[u] / layout->dim[u];
- idx_max[u] = (offset_f[u]+size[u]-1) / layout->dim[u] + 1;
- idx_cur[u] = idx_min[u];
- }
-
- /* Loop over all chunks */
- 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);
- chunk_offset[u] = idx_cur[u] * (hssize_t)(layout->dim[u]);
-
- /* The offset and size wrt the chunk */
- offset_wrt_chunk[u] = MAX(offset_f[u], chunk_offset[u]) -
- chunk_offset[u];
- sub_size[u] = MIN((idx_cur[u]+1)*layout->dim[u],
- offset_f[u]+size[u]) -
- (chunk_offset[u] + offset_wrt_chunk[u]);
- naccessed *= sub_size[u];
-
- /* Offset into mem buffer */
- sub_offset_m[u] = chunk_offset[u] + offset_wrt_chunk[u] +
- offset_m[u] - offset_f[u];
- }
+ if (chunk_size>f->shared->rdcc_nbytes && pline.nfilters==0 &&
+ chunk_addr!=HADDR_UNDEF) {
+ if ((ret_value=H5F_contig_readvv(f, chunk_size, chunk_addr, chunk_max_nseq, chunk_curr_seq, chunk_len_arr, chunk_offset_arr, mem_max_nseq, mem_curr_seq, mem_len_arr, mem_offset_arr, dxpl_id, buf))<0)
+ HGOTO_ERROR (H5E_IO, H5E_READERROR, FAIL, "unable to read raw data to file");
+ } /* end if */
+ else {
+ uint8_t *chunk; /* Pointer to cached chunk in memory */
+ H5O_fill_t fill; /* Fill value information */
+ unsigned idx_hint=0; /* Cache index hint */
+ ssize_t naccessed; /* Number of bytes accessed in chunk */
- /* Get the address of this chunk on disk */
- chunk_addr=H5F_istore_get_addr(f, dxpl_id, layout, chunk_offset);
+ /* 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 the chunk is too large to load into the cache and it has no
- * filters in the pipeline (i.e. not compressed) and if the address
- * for the chunk has been defined, then don't load the chunk into the
- * cache, just read the data from it directly.
+ * Lock the chunk, copy from application to chunk, then unlock the
+ * chunk.
*/
- if ((chunk_size>f->shared->rdcc_nbytes && pline.nfilters==0 &&
- chunk_addr!=HADDR_UNDEF)
+ if (NULL==(chunk=H5F_istore_lock(f, dxpl_id, layout, &pline, &fill,
+ chunk_coords_in_elmts, FALSE, &idx_hint)))
+ HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "unable to read raw data chunk");
- /*
- * If MPIO, MPIPOSIX, or FPHDF5 is used and file can be written
- * to, we must bypass the chunk-cache scheme because other MPI
- * processes could be writing to other elements in the same
- * chunk. Do a direct write-through of only the elements
- * requested.
- */
- || ((IS_H5FD_MPIO(f) ||IS_H5FD_MPIPOSIX(f) || IS_H5FD_FPHDF5(f)) && (H5F_ACC_RDWR & f->shared->flags))
- ) {
- H5O_layout_t l; /* temporary layout */
+ /* Use the vectorized memory copy routine to do actual work */
+ if((naccessed=H5V_memcpyvv(buf,mem_max_nseq,mem_curr_seq,mem_len_arr,mem_offset_arr,chunk,chunk_max_nseq,chunk_curr_seq,chunk_len_arr,chunk_offset_arr))<0)
+ HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "vectorized memcpy failed");
-#ifdef H5_HAVE_PARALLEL
- /* Additional sanity checks when operating in parallel */
- 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 */
-
- /*
- * use default transfer mode as we do not support collective
- * transfer mode since each data write could decompose into
- * multiple chunk writes and we are not doing the calculation yet.
- */
- l.type = H5D_CONTIGUOUS;
- l.ndims = layout->ndims;
- for (u=l.ndims; u-- > 0; /*void*/)
- l.dim[u] = layout->dim[u];
- l.addr = chunk_addr;
- if (H5F_arr_read(f, dxpl_id, &l, dc_plist, sub_size, size_m, sub_offset_m, offset_wrt_chunk, buf)<0)
- 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)))
- 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)
- HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "unable to unlock raw data chunk");
- } /* end else */
-
- /* Increment indices */
- for (i=(int)(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;
- }
- }
+ H5_CHECK_OVERFLOW(naccessed,ssize_t,size_t);
+ if (H5F_istore_unlock(f, dxpl_id, layout, &pline, FALSE,
+ chunk_coords_in_elmts, &idx_hint, chunk, (size_t)naccessed)<0)
+ HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "unable to unlock raw data chunk");
+ /* Set return value */
+ ret_value=naccessed;
+ } /* end else */
+
done:
FUNC_LEAVE_NOAPI(ret_value);
-}
+} /* H5F_istore_readvv() */
/*-------------------------------------------------------------------------
- * Function: H5F_istore_write
+ * Function: H5F_istore_writevv
*
* Purpose: Writes a multi-dimensional buffer to (part of) an indexed raw
* storage array.
*
* Return: Non-negative on success/Negative on failure
*
- * Programmer: Robb Matzke
- * Wednesday, October 15, 1997
+ * Programmer: Quincey Koziol
+ * Friday, May 2, 2003
*
* Modifications:
- * Robb Matzke, 1999-08-02
- * The data transfer property list is passed as an object ID
- * since that's how the virtual file layer wants it.
*
- * Quincey Koziol, 2002-04-02
- * Enable hyperslab I/O into memory buffer
*-------------------------------------------------------------------------
*/
-herr_t
-H5F_istore_write(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout,
- 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)
+ssize_t
+H5F_istore_writevv(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout,
+ H5P_genplist_t *dc_plist, hssize_t chunk_coords[],
+ size_t chunk_max_nseq, size_t *chunk_curr_seq, size_t chunk_len_arr[], hsize_t chunk_offset_arr[],
+ size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_len_arr[], hsize_t mem_offset_arr[],
+ const void *buf)
{
- int i, carry;
- unsigned u;
- hsize_t idx_cur[H5O_LAYOUT_NDIMS];
- hsize_t idx_min[H5O_LAYOUT_NDIMS];
- hsize_t idx_max[H5O_LAYOUT_NDIMS];
- hsize_t sub_size[H5O_LAYOUT_NDIMS];
- hssize_t chunk_offset[H5O_LAYOUT_NDIMS];
- hssize_t offset_wrt_chunk[H5O_LAYOUT_NDIMS];
- hssize_t sub_offset_m[H5O_LAYOUT_NDIMS];
- uint8_t *chunk=NULL;
- unsigned idx_hint=0;
- hsize_t chunk_size, naccessed;
+ hsize_t chunk_size; /* Chunk size, in bytes */
haddr_t chunk_addr; /* Chunk address on disk */
+ hssize_t chunk_coords_in_elmts[H5O_LAYOUT_NDIMS];
H5O_pline_t pline; /* I/O pipeline information */
- H5O_fill_t fill; /* Fill value information */
- herr_t ret_value = SUCCEED; /* Return value */
+ size_t u; /* Local index variables */
+ ssize_t ret_value; /* Return value */
- FUNC_ENTER_NOAPI(H5F_istore_write, FAIL);
+ FUNC_ENTER_NOAPI(H5F_istore_writevv, 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(size_m);
- assert(offset_m);
- assert(offset_f);
- assert(size);
+ assert(chunk_len_arr);
+ assert(chunk_offset_arr);
+ assert(mem_len_arr);
+ assert(mem_offset_arr);
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");
@@ -1933,118 +1841,79 @@ H5F_istore_write(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout,
chunk_size *= layout->dim[u];
#ifndef NDEBUG
- for (u=0; u<layout->ndims; u++) {
- assert(offset_f[u]>=0); /*negative offsets not supported*/
- assert(offset_m[u]>=0); /*negative offsets not supported*/
- assert(size[u]<SIZET_MAX);
- assert(offset_m[u]+(hssize_t)size[u]<=(hssize_t)size_m[u]);
- assert(layout->dim[u]>0);
- }
+ for (u=0; u<layout->ndims; u++)
+ assert(chunk_coords[u]>=0); /*negative coordinates not supported (yet) */
#endif
+
+ for (u=0; u<layout->ndims; u++)
+ chunk_coords_in_elmts[u] = chunk_coords[u] * (hssize_t)(layout->dim[u]);
+
+ /* Get the address of this chunk on disk */
+ chunk_addr=H5F_istore_get_addr(f, dxpl_id, layout, chunk_coords_in_elmts);
/*
- * 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.
+ * If the chunk is too large to load into the cache and it has no
+ * filters in the pipeline (i.e. not compressed) and if the address
+ * for the chunk has been defined, then don't load the chunk into the
+ * cache, just write the data to it directly.
+ *
+ * If MPIO, MPIPOSIX, or FPHDF5 is used, must bypass the
+ * chunk-cache scheme because other MPI processes could be
+ * writing to other elements in the same chunk. Do a direct
+ * write-through of only the elements requested.
*/
- for (u=0; u<layout->ndims; u++) {
- idx_min[u] = offset_f[u] / layout->dim[u];
- idx_max[u] = (offset_f[u]+size[u]-1) / layout->dim[u] + 1;
- idx_cur[u] = idx_min[u];
- }
-
-
- /* Loop over all chunks */
- 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);
- chunk_offset[u] = idx_cur[u] * (hssize_t)(layout->dim[u]);
-
- /* The offset and size wrt the chunk */
- offset_wrt_chunk[u] = MAX(offset_f[u], chunk_offset[u]) -
- chunk_offset[u];
- sub_size[u] = MIN((idx_cur[u]+1)*layout->dim[u],
- offset_f[u]+size[u]) -
- (chunk_offset[u] + offset_wrt_chunk[u]);
- naccessed *= sub_size[u];
-
- /* Offset into mem buffer */
- sub_offset_m[u] = chunk_offset[u] + offset_wrt_chunk[u] +
- offset_m[u] - offset_f[u];
- }
-
- /* Get the address of this chunk on disk */
- chunk_addr=H5F_istore_get_addr(f, dxpl_id, layout, chunk_offset);
+ if ((chunk_size>f->shared->rdcc_nbytes && pline.nfilters==0 &&
+ chunk_addr!=HADDR_UNDEF)
+ || ((IS_H5FD_MPIO(f) ||IS_H5FD_MPIPOSIX(f) || IS_H5FD_FPHDF5(f)) &&
+ (H5F_ACC_RDWR & f->shared->flags))) {
+#ifdef H5_HAVE_PARALLEL
+ /* Additional sanity check when operating in parallel */
+ 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 */
+ if ((ret_value=H5F_contig_writevv(f, chunk_size, chunk_addr, chunk_max_nseq, chunk_curr_seq, chunk_len_arr, chunk_offset_arr, mem_max_nseq, mem_curr_seq, mem_len_arr, mem_offset_arr, dxpl_id, buf))<0)
+ HGOTO_ERROR (H5E_IO, H5E_WRITEERROR, FAIL, "unable to write raw data to file");
+ } /* end if */
+ else {
+ uint8_t *chunk; /* Pointer to cached chunk in memory */
+ H5O_fill_t fill; /* Fill value information */
+ unsigned idx_hint=0; /* Cache index hint */
+ ssize_t naccessed; /* Number of bytes accessed in chunk */
+ hbool_t relax; /* Whether whole chunk is selected */
- /*
- * If the chunk is too large to load into the cache and it has no
- * filters in the pipeline (i.e. not compressed) and if the address
- * 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 &&
- chunk_addr!=HADDR_UNDEF)
+ /* 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 MPIO, MPIPOSIX, or FPHDF5 is used, must bypass the
- * chunk-cache scheme because other MPI processes could be
- * writing to other elements in the same chunk. Do a direct
- * write-through of only the elements requested.
+ * Lock the chunk, copy from application to chunk, then unlock the
+ * chunk.
*/
- || ((IS_H5FD_MPIO(f) ||IS_H5FD_MPIPOSIX(f) || IS_H5FD_FPHDF5(f)) && (H5F_ACC_RDWR & f->shared->flags))
- ) {
- H5O_layout_t l; /* temporary layout */
-
-#ifdef H5_HAVE_PARALLEL
- /* Additional sanity check when operating in parallel */
- 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 */
-
- /*
- * use default transfer mode as we do not support collective
- * transfer mode since each data write could decompose into
- * multiple chunk writes and we are not doing the calculation yet.
- */
- l.type = H5D_CONTIGUOUS;
- l.ndims = layout->ndims;
- for (u=l.ndims; u-- > 0; /*void*/)
- l.dim[u] = layout->dim[u];
- l.addr = chunk_addr;
- if (H5F_arr_write(f, dxpl_id, &l, dc_plist, sub_size, size_m, sub_offset_m, offset_wrt_chunk, buf)<0)
- 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,
- chunk_offset, (hbool_t)(naccessed==chunk_size), &idx_hint)))
- 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,
- chunk_offset, &idx_hint, chunk, (size_t)naccessed)<0)
- HGOTO_ERROR (H5E_IO, H5E_WRITEERROR, FAIL, "uanble to unlock raw data chunk");
- } /* end else */
+ if(chunk_max_nseq==1 && chunk_len_arr[0] == chunk_size)
+ relax = TRUE;
+ else
+ relax = FALSE;
+
+ if (NULL==(chunk=H5F_istore_lock(f, dxpl_id, layout, &pline, &fill,
+ chunk_coords_in_elmts, relax, &idx_hint)))
+ HGOTO_ERROR (H5E_IO, H5E_WRITEERROR, FAIL, "unable to read raw data chunk");
+
+ /* Use the vectorized memory copy routine to do actual work */
+ if((naccessed=H5V_memcpyvv(chunk,chunk_max_nseq,chunk_curr_seq,chunk_len_arr,chunk_offset_arr,buf,mem_max_nseq,mem_curr_seq,mem_len_arr,mem_offset_arr))<0)
+ HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "vectorized memcpy failed");
+
+ H5_CHECK_OVERFLOW(naccessed,ssize_t,size_t);
+ if (H5F_istore_unlock(f, dxpl_id, layout, &pline, TRUE,
+ chunk_coords_in_elmts, &idx_hint, chunk, (size_t)naccessed)<0)
+ HGOTO_ERROR (H5E_IO, H5E_WRITEERROR, FAIL, "uanble to unlock raw data chunk");
+
+ /* Set return value */
+ ret_value=naccessed;
+ } /* end else */
- /* 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;
- }
- } /* end while */
-
done:
FUNC_LEAVE_NOAPI(ret_value);
-}
+} /* H5F_istore_writevv() */
/*-------------------------------------------------------------------------
@@ -2808,7 +2677,8 @@ H5F_istore_initialize_by_extent(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *lay
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 srank; /*current # of dimensions (signed) */
+ unsigned rank; /*current # of dimensions */
int i, carry; /*counters */
unsigned u;
int found = 0; /*initialize this entry */
@@ -2836,13 +2706,14 @@ H5F_istore_initialize_by_extent(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *lay
HDmemset(count, 0, sizeof(count));
/* Go get the rank & dimensions */
- if((rank = H5S_get_simple_extent_dims(space, curr_dims, NULL)) < 0)
+ if((srank = H5S_get_simple_extent_dims(space, curr_dims, NULL)) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get dataset dimensions");
+ rank=srank;
/* Copy current dimensions */
- for(i = 0; i < rank; i++)
- size[i] = curr_dims[i];
- size[i] = layout->dim[i];
+ for(u = 0; u < rank; u++)
+ size[u] = curr_dims[u];
+ size[u] = layout->dim[u];
/* Create a data space for a chunk & set the extent */
if(NULL == (space_chunk = H5S_create_simple(rank,layout->dim,NULL)))
@@ -2891,8 +2762,8 @@ H5F_istore_initialize_by_extent(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *lay
if(H5S_select_all(space_chunk,1) < 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(u = 0; u < rank; u++)
+ count[u] = MIN((idx_cur[u] + 1) * layout->dim[u], size[u] - chunk_offset[u]);
#if defined (H5F_ISTORE_DEBUG)
HDfputs("cache:initialize:offset:[", stdout);