summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDana Robinson <derobins@hdfgroup.org>2018-05-31 23:14:24 (GMT)
committerDana Robinson <derobins@hdfgroup.org>2018-05-31 23:14:24 (GMT)
commitdec2f588acad45eaa02061d7d28774e5c6915f70 (patch)
tree5029cc9e0acf30aef5083e692574899f768c8d13
parent1c7b0bc85713d4eafeb7c8157d6526b42826f0ca (diff)
parent1da9c5545c013ebc540ba3044810889d4acfa5be (diff)
downloadhdf5-dec2f588acad45eaa02061d7d28774e5c6915f70.zip
hdf5-dec2f588acad45eaa02061d7d28774e5c6915f70.tar.gz
hdf5-dec2f588acad45eaa02061d7d28774e5c6915f70.tar.bz2
Merge pull request #1043 in HDFFV/hdf5 from ~DEROBINS/hdf5_der:h5do_direct_chunk_hl_to_src to develop
* commit '1da9c5545c013ebc540ba3044810889d4acfa5be': Restored some unused #defines to the deprecated section of H5Dpublic.h. Added deprecated symbol wrappers for the H5DOwrite/read_chunk wrappers. Updated commenting in the H5DO compat test. Stripped out most of the duplicated functionality in the H5DO compat test. * Added H5DO compatibility functions. * Changed the offset copy to use an array on the stack. * Yanked some unused #defines. * Fixed the error tests * Moved common functionality into helper functions Normalize with trunk prior to update merge Fixed a warning. Finished move of H5DOread/write_chunk calls to H5D. First stage of moving H5DOread/write_chunk() to src/ and making them H5D calls. * Moved H5DOread/write_chunk() to H5Dio.c and renamed to H5D*. * Moved the hl/test/test_dset_opt test to test/ and renamed to direct_chunk. * Moved the hl/test/dectris_hl_perf test to tools/test/perform and renamed to direct_write_perf. * Updated autotools and CMake files.
-rw-r--r--hl/src/H5DO.c233
-rw-r--r--hl/src/H5DOpublic.h23
-rw-r--r--hl/test/CMakeLists.txt2
-rw-r--r--hl/test/CMakeTests.cmake4
-rw-r--r--hl/test/Makefile.am8
-rw-r--r--hl/test/test_h5do_compat.c286
-rw-r--r--src/H5CX.c280
-rw-r--r--src/H5CXprivate.h7
-rw-r--r--src/H5Dio.c465
-rw-r--r--src/H5Dpkg.h2
-rw-r--r--src/H5Dpublic.h29
-rw-r--r--src/H5Pdxpl.c65
-rw-r--r--src/H5S.c53
-rw-r--r--src/H5Sprivate.h1
-rw-r--r--test/CMakeLists.txt1
-rw-r--r--test/CMakeTests.cmake1
-rw-r--r--test/Makefile.am13
-rw-r--r--test/direct_chunk.c (renamed from hl/test/test_dset_opt.c)160
-rw-r--r--test/testfiles/err_compat_12
-rw-r--r--test/testfiles/error_test_14
-rw-r--r--tools/test/perform/direct_write_perf.c (renamed from hl/test/dectris_hl_perf.c)19
21 files changed, 791 insertions, 867 deletions
diff --git a/hl/src/H5DO.c b/hl/src/H5DO.c
index 99cf2f7..057c43b 100644
--- a/hl/src/H5DO.c
+++ b/hl/src/H5DO.c
@@ -11,90 +11,37 @@
* help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-#include <string.h>
-#include <stdlib.h>
-#include <assert.h>
-#include <stdio.h>
-
/* High-level library internal header file */
#include "H5HLprivate2.h"
/* public LT prototypes */
#include "H5DOpublic.h"
-
+#ifndef H5_NO_DEPRECATED_SYMBOLS
/*-------------------------------------------------------------------------
- * Function: H5DOwrite_chunk
+ * Function: H5DOwrite_chunk
*
- * Purpose: Writes an entire chunk to the file directly.
+ * Purpose: Writes an entire chunk to the file directly.
*
- * Return: Non-negative on success/Negative on failure
+ * The H5DOwrite_chunk() call was moved to H5Dwrite_chunk. This
+ * simple wrapper remains so that people can still link to the
+ * high-level library without changing their code.
*
- * Programmer: Raymond Lu
- * 30 July 2012
+ * Return: Non-negative on success/Negative on failure
*
*-------------------------------------------------------------------------
*/
herr_t
-H5DOwrite_chunk(hid_t dset_id, hid_t dxpl_id, uint32_t filters, const hsize_t *offset,
+H5DOwrite_chunk(hid_t dset_id, hid_t dxpl_id, uint32_t filters, const hsize_t *offset,
size_t data_size, const void *buf)
{
- hbool_t created_dxpl = FALSE; /* Whether we created a DXPL */
- hbool_t do_direct_write = TRUE; /* Flag for direct writes */
- uint32_t data_size_32; /* Chunk data size (limited to 32-bits currently) */
- herr_t ret_value = FAIL; /* Return value */
-
- /* Check arguments */
- if(dset_id < 0)
- goto done;
- if(!buf)
- goto done;
- if(!offset)
- goto done;
- if(!data_size)
- goto done;
- data_size_32 = (uint32_t)data_size;
- if(data_size != (size_t)data_size_32)
- goto done;
-
- /* If the user passed in a default DXPL, create one to pass to H5Dwrite() */
- if(H5P_DEFAULT == dxpl_id) {
- if((dxpl_id = H5Pcreate(H5P_DATASET_XFER)) < 0)
- goto done;
- created_dxpl = TRUE;
- } /* end if */
-
- /* Set direct write parameters */
- if(H5Pset(dxpl_id, H5D_XFER_DIRECT_CHUNK_WRITE_FLAG_NAME, &do_direct_write) < 0)
- goto done;
- if(H5Pset(dxpl_id, H5D_XFER_DIRECT_CHUNK_WRITE_FILTERS_NAME, &filters) < 0)
- goto done;
- if(H5Pset(dxpl_id, H5D_XFER_DIRECT_CHUNK_WRITE_OFFSET_NAME, &offset) < 0)
- goto done;
- if(H5Pset(dxpl_id, H5D_XFER_DIRECT_CHUNK_WRITE_DATASIZE_NAME, &data_size_32) < 0)
- goto done;
+ /* Call underlying H5D function */
+ if (H5Dwrite_chunk(dset_id, dxpl_id, filters, offset, data_size, buf) < 0)
+ return FAIL;
+ else
+ return SUCCEED;
- /* Write chunk */
- if(H5Dwrite(dset_id, 0, H5S_ALL, H5S_ALL, dxpl_id, buf) < 0)
- goto done;
-
- /* Indicate success */
- ret_value = SUCCEED;
-
-done:
- if(created_dxpl) {
- if(H5Pclose(dxpl_id) < 0)
- ret_value = FAIL;
- } /* end if */
- else {
- /* Reset the direct write flag on user DXPL */
- do_direct_write = FALSE;
- if(H5Pset(dxpl_id, H5D_XFER_DIRECT_CHUNK_WRITE_FLAG_NAME, &do_direct_write) < 0)
- ret_value = FAIL;
- }
-
- return ret_value;
} /* end H5DOwrite_chunk() */
@@ -103,10 +50,11 @@ done:
*
* Purpose: Reads an entire chunk from the file directly.
*
- * Return: Non-negative on success/Negative on failure
+ * The H5DOread_chunk() call was moved to H5Dread_chunk. This
+ * simple wrapper remains so that people can still link to the
+ * high-level library without changing their code.
*
- * Programmer: Matthew Strong (GE Healthcare)
- * 14 February 2016
+ * Return: Non-negative on success/Negative on failure
*
*---------------------------------------------------------------------------
*/
@@ -114,71 +62,29 @@ herr_t
H5DOread_chunk(hid_t dset_id, hid_t dxpl_id, const hsize_t *offset, uint32_t *filters,
void *buf)
{
- hbool_t created_dxpl = FALSE; /* Whether we created a DXPL */
- hbool_t do_direct_read = TRUE; /* Flag for direct writes */
- herr_t ret_value = FAIL; /* Return value */
-
- /* Check arguments */
- if(dset_id < 0)
- goto done;
- if(!buf)
- goto done;
- if(!offset)
- goto done;
- if(!filters)
- goto done;
+ /* Call underlying H5D function */
+ if (H5Dread_chunk(dset_id, dxpl_id, offset, filters, buf) < 0)
+ return FAIL;
+ else
+ return SUCCEED;
+ } /* end H5DOread_chunk() */
- /* If the user passed in a default DXPL, create one to pass to H5Dwrite() */
- if(H5P_DEFAULT == dxpl_id) {
- if((dxpl_id = H5Pcreate(H5P_DATASET_XFER)) < 0)
- goto done;
- created_dxpl = TRUE;
- } /* end if */
-
- /* Set direct write parameters */
- if(H5Pset(dxpl_id, H5D_XFER_DIRECT_CHUNK_READ_FLAG_NAME, &do_direct_read) < 0)
- goto done;
- if(H5Pset(dxpl_id, H5D_XFER_DIRECT_CHUNK_READ_OFFSET_NAME, &offset) < 0)
- goto done;
-
- /* Read chunk */
- if(H5Dread(dset_id, 0, H5S_ALL, H5S_ALL, dxpl_id, buf) < 0)
- goto done;
- /* Get the filter mask */
- if(H5Pget(dxpl_id, H5D_XFER_DIRECT_CHUNK_READ_FILTERS_NAME, filters) < 0)
- goto done;
-
- /* Indicate success */
- ret_value = SUCCEED;
-
-done:
- if(created_dxpl) {
- if(H5Pclose(dxpl_id) < 0)
- ret_value = FAIL;
- } /* end if */
- else {
- /* Reset the direct read flag on user DXPL */
- do_direct_read = FALSE;
- if(H5Pset(dxpl_id, H5D_XFER_DIRECT_CHUNK_READ_FLAG_NAME, &do_direct_read) < 0)
- ret_value = FAIL;
- }
-
- return ret_value;
-} /* end H5DOread_chunk() */
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
/*-------------------------------------------------------------------------
- * Function: H5DOappend()
+ * Function: H5DOappend()
*
* Purpose: To append elements to a dataset.
- * axis: the dataset dimension (zero-based) for the append
- * extension: the # of elements to append for the axis-th dimension
- * memtype: the datatype
- * buf: buffer with data for the append
*
- * Return: Non-negative on success/Negative on failure
+ * axis: the dataset dimension (zero-based) for the append
+ * extension: the # of elements to append for the axis-th dimension
+ * memtype: the datatype
+ * buf: buffer with data for the append
*
- * Programmer: Vailin Choi; Jan 2014
+ * Return: Non-negative on success/Negative on failure
+ *
+ * Programmer: Vailin Choi; Jan 2014
*
* Note:
* This routine is copied from the fast forward feature branch: features/hdf5_ff
@@ -227,7 +133,7 @@ H5DOappend(hid_t dset_id, hid_t dxpl_id, unsigned axis, size_t extension,
/* check arguments */
if(H5I_DATASET != H5Iget_type(dset_id))
- goto done;
+ goto done;
/* If the user passed in a default DXPL, create one to pass to H5Dwrite() */
if(H5P_DEFAULT == dxpl_id) {
@@ -236,39 +142,40 @@ H5DOappend(hid_t dset_id, hid_t dxpl_id, unsigned axis, size_t extension,
created_dxpl = TRUE;
} /* end if */
else if(TRUE != H5Pisa_class(dxpl_id, H5P_DATASET_XFER))
- goto done;
+ goto done;
/* Get the dataspace of the dataset */
if(FAIL == (space_id = H5Dget_space(dset_id)))
- goto done;
+ goto done;
/* Get the rank of this dataspace */
if((sndims = H5Sget_simple_extent_ndims(space_id)) < 0)
- goto done;
+ goto done;
ndims = (unsigned)sndims;
/* Verify correct axis */
if(axis >= ndims)
- goto done;
+ goto done;
/* Get the dimensions sizes of the dataspace */
if(H5Sget_simple_extent_dims(space_id, size, NULL) < 0)
- goto done;
+ goto done;
/* Adjust the dimension size of the requested dimension,
- but first record the old dimension size */
+ * but first record the old dimension size
+ */
old_size = size[axis];
size[axis] += extension;
if(size[axis] < old_size)
- goto done;
+ goto done;
/* Set the extent of the dataset to the new dimension */
if(H5Dset_extent(dset_id, size) < 0)
- goto done;
+ goto done;
/* Get the new dataspace of the dataset */
if(FAIL == (new_space_id = H5Dget_space(dset_id)))
- goto done;
+ goto done;
/* Select a hyperslab corresponding to the append operation */
for(u = 0 ; u < ndims ; u++) {
@@ -282,51 +189,51 @@ H5DOappend(hid_t dset_id, hid_t dxpl_id, unsigned axis, size_t extension,
} /* end if */
} /* end for */
if(FAIL == H5Sselect_hyperslab(new_space_id, H5S_SELECT_SET, start, stride, count, block))
- goto done;
+ goto done;
/* The # of elemnts in the new extended dataspace */
if((snelmts = H5Sget_select_npoints(new_space_id)) < 0)
- goto done;
+ goto done;
nelmts = (hsize_t)snelmts;
/* create a memory space */
if(FAIL == (mem_space_id = H5Screate_simple(1, &nelmts, NULL)))
- goto done;
+ goto done;
/* Write the data */
if(H5Dwrite(dset_id, memtype, mem_space_id, new_space_id, dxpl_id, buf) < 0)
- goto done;
+ goto done;
/* Obtain the dataset's access property list */
if((dapl = H5Dget_access_plist(dset_id)) < 0)
- goto done;
+ goto done;
/* Allocate the boundary array */
boundary = (hsize_t *)HDmalloc(ndims * sizeof(hsize_t));
/* Retrieve the append flush property */
if(H5Pget_append_flush(dapl, ndims, boundary, &append_cb, &udata) < 0)
- goto done;
+ goto done;
/* No boundary for this axis */
if(boundary[axis] != 0) {
- /* Determine whether a boundary is hit or not */
- for(k = start[axis]; k < size[axis]; k++)
- if(!((k + 1) % boundary[axis])) {
- hit = TRUE;
- break;
- }
-
- if(hit) { /* Hit the boundary */
- /* Invoke callback if there is one */
- if(append_cb && append_cb(dset_id, size, udata) < 0)
- goto done;
-
- /* Do a dataset flush */
- if(H5Dflush(dset_id) < 0)
- goto done;
- } /* end if */
+ /* Determine whether a boundary is hit or not */
+ for(k = start[axis]; k < size[axis]; k++)
+ if(!((k + 1) % boundary[axis])) {
+ hit = TRUE;
+ break;
+ }
+
+ if(hit) { /* Hit the boundary */
+ /* Invoke callback if there is one */
+ if(append_cb && append_cb(dset_id, size, udata) < 0)
+ goto done;
+
+ /* Do a dataset flush */
+ if(H5Dflush(dset_id) < 0)
+ goto done;
+ } /* end if */
} /* end if */
/* Indicate success */
@@ -341,22 +248,22 @@ done:
/* Close old dataspace */
if(space_id != FAIL && H5Sclose(space_id) < 0)
- ret_value = FAIL;
+ ret_value = FAIL;
/* Close new dataspace */
if(new_space_id != FAIL && H5Sclose(new_space_id) < 0)
- ret_value = FAIL;
+ ret_value = FAIL;
/* Close memory dataspace */
if(mem_space_id != FAIL && H5Sclose(mem_space_id) < 0)
- ret_value = FAIL;
+ ret_value = FAIL;
/* Close the dataset access property list */
if(dapl != FAIL && H5Pclose(dapl) < 0)
- ret_value = FAIL;
+ ret_value = FAIL;
if(boundary)
- HDfree(boundary);
+ HDfree(boundary);
return ret_value;
} /* H5DOappend() */
diff --git a/hl/src/H5DOpublic.h b/hl/src/H5DOpublic.h
index d5c8de4..e09ebca 100644
--- a/hl/src/H5DOpublic.h
+++ b/hl/src/H5DOpublic.h
@@ -25,18 +25,23 @@ extern "C" {
*-------------------------------------------------------------------------
*/
-H5_HLDLL herr_t H5DOwrite_chunk(hid_t dset_id, hid_t dxpl_id, uint32_t filters,
- const hsize_t *offset, size_t data_size, const void *buf);
-
-H5_HLDLL herr_t H5DOread_chunk(hid_t dset_id, /*in*/
- hid_t dxpl_id, /*in*/
- const hsize_t *offset, /*in*/
- uint32_t *filters, /*out*/
- void *buf); /*out*/
-
H5_HLDLL herr_t H5DOappend(hid_t dset_id, hid_t dxpl_id, unsigned axis,
size_t extension, hid_t memtype, const void *buf);
+/* Symbols defined for compatibility with previous versions of the HDF5 API.
+ *
+ * Use of these symbols is deprecated.
+ */
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+
+/* Compatibility wrappers for functionality moved to H5D */
+H5_HLDLL herr_t H5DOwrite_chunk(hid_t dset_id, hid_t dxpl_id, uint32_t filters,
+ const hsize_t *offset, size_t data_size, const void *buf);
+H5_HLDLL herr_t H5DOread_chunk(hid_t dset_id, hid_t dxpl_id, const hsize_t *offset,
+ uint32_t *filters /*out*/, void *buf /*out*/);
+
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+
#ifdef __cplusplus
}
#endif
diff --git a/hl/test/CMakeLists.txt b/hl/test/CMakeLists.txt
index 44f286b..238b5e1 100644
--- a/hl/test/CMakeLists.txt
+++ b/hl/test/CMakeLists.txt
@@ -46,9 +46,9 @@ HL_ADD_EXE (test_image)
HL_ADD_EXE (test_file_image)
HL_ADD_EXE (test_table)
HL_ADD_EXE (test_ds)
-HL_ADD_EXE (test_dset_opt)
HL_ADD_EXE (test_ld)
HL_ADD_EXE (test_dset_append)
+HL_ADD_EXE (test_h5do_compat)
# test_packet has two source files
add_executable (hl_test_packet test_packet.c test_packet_vlen.c)
diff --git a/hl/test/CMakeTests.cmake b/hl/test/CMakeTests.cmake
index e5eb58e..4e945bc 100644
--- a/hl/test/CMakeTests.cmake
+++ b/hl/test/CMakeTests.cmake
@@ -79,6 +79,7 @@ add_test (
file_img1.h5
file_img2.h5
test_append.h5
+ h5do_compat.h5
test_detach.h5
test_ds1.h5
test_ds2.h5
@@ -90,7 +91,6 @@ add_test (
test_ds8.h5
test_ds9.h5
test_ds10.h5
- test_dectris.h5
test_image1.h5
test_image2.h5
test_image3.h5
@@ -115,7 +115,7 @@ HL_add_test (test_file_image)
HL_add_test (test_table)
HL_add_test (test_ds)
HL_add_test (test_packet)
-HL_add_test (test_dset_opt)
HL_add_test (test_ld)
HL_add_test (test_dset_append)
+HL_add_test (test_h5do_compat)
diff --git a/hl/test/Makefile.am b/hl/test/Makefile.am
index e16550f..2e63438 100644
--- a/hl/test/Makefile.am
+++ b/hl/test/Makefile.am
@@ -26,8 +26,8 @@ LDADD=$(LIBH5_HL) $(LIBH5TEST) $(LIBHDF5)
# Test programs. These are our main targets. They should be listed in the
# order to be executed, generally most specific tests to least specific tests.
-TEST_PROG=test_lite test_image test_file_image test_table test_ds test_packet test_dset_opt \
- test_ld test_dset_append
+TEST_PROG=test_lite test_image test_file_image test_table test_ds test_packet \
+ test_ld test_dset_append test_h5do_compat
check_PROGRAMS=$(TEST_PROG)
# These programs generate test files for the tests. They don't need to be
@@ -45,8 +45,8 @@ endif
CHECK_CLEANFILES+=combine_tables[1-2].h5 test_ds[1-9].h5 test_ds10.h5 \
test_image[1-3].h5 file_img[1-2].h5 test_lite[1-4].h5 test_table.h5 \
test_packet_table.h5 test_packet_compress.h5 test_detach.h5 \
- test_packet_table_vlen.h5 testfl_packet_table_vlen.h5 \
- test_dectris.h5 test_append.h5
+ test_packet_table_vlen.h5 testfl_packet_table_vlen.h5 test_append.h5 \
+ h5do_compat.h5
# Sources for test_packet executable
test_packet_SOURCES=test_packet.c test_packet_vlen.c
diff --git a/hl/test/test_h5do_compat.c b/hl/test/test_h5do_compat.c
new file mode 100644
index 0000000..4df5eef
--- /dev/null
+++ b/hl/test/test_h5do_compat.c
@@ -0,0 +1,286 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group. *
+ * Copyright by the Board of Trustees of the University of Illinois. *
+ * All rights reserved. *
+ * *
+ * This file is part of HDF5. The full HDF5 copyright notice, including *
+ * terms governing use, modification, and redistribution, is contained in *
+ * the COPYING file, which can be found at the root of the source code *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases. *
+ * If you do not have access to either file, you may request a copy from *
+ * help@hdfgroup.org. *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "h5hltest.h"
+#include "H5DOpublic.h"
+
+/* This test is a minimal test to ensure that the H5DO compatibility wrappers
+ * work correctly.
+ */
+
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+
+#define FILE_NAME "h5do_compat.h5"
+#define DATASET_NAME "direct_chunk_io"
+
+#define NX 8
+#define CHUNK_NX 4
+
+
+/*-------------------------------------------------------------------------
+ * Function: test_direct_chunk_write
+ *
+ * Purpose: Test the basic functionality of H5DOwrite_chunk
+ *
+ * Return: Success: An identifer for the dataset used in the tests
+ * Failure: H5I_INVALID_HID
+ *
+ *-------------------------------------------------------------------------
+ */
+static hid_t
+create_dataset(hid_t fid)
+{
+ hid_t did = H5I_INVALID_HID;
+ hid_t sid = H5I_INVALID_HID;
+ hid_t dcpl_id = H5I_INVALID_HID;
+ hsize_t dims[1] = {NX};
+ hsize_t maxdims[1] = {H5S_UNLIMITED};
+ hsize_t chunk_dims[1] = {CHUNK_NX};
+ int data[NX];
+ int i;
+
+ /* Create a dataspace for the new dataset */
+ if ((sid = H5Screate_simple(1, dims, maxdims)) < 0)
+ goto error;
+
+ /* Set up dataset creation parameters */
+ if ((dcpl_id = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+ goto error;
+ if (H5Pset_chunk(dcpl_id, 1, chunk_dims) < 0)
+ goto error;
+
+ /* Create a new dataset */
+ if ((did = H5Dcreate2(fid, DATASET_NAME, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl_id, H5P_DEFAULT)) < 0)
+ goto error;
+
+ /* Initialize the data */
+ for (i = 0; i < NX; i++)
+ data[i] = i;
+
+ /* Write the initialized data */
+ if (H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data) < 0)
+ goto error;
+
+ /* Close everything */
+ if (H5Sclose(sid) < 0)
+ goto error;
+ if (H5Pclose(dcpl_id) < 0)
+ goto error;
+
+ return did;
+
+ error:
+ H5E_BEGIN_TRY {
+ H5Dclose(did);
+ H5Sclose(sid);
+ H5Pclose(dcpl_id);
+ } H5E_END_TRY;
+
+ return H5I_INVALID_HID;
+
+} /* end create_dataset() */
+
+
+
+/*-------------------------------------------------------------------------
+ * Function: test_direct_chunk_write
+ *
+ * Purpose: Test the basic functionality of H5DOwrite_chunk
+ *
+ * Return: Success: 0
+ * Failure: 1
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+test_direct_chunk_write(hid_t did)
+{
+ unsigned filter_mask = 0;
+ int chunk_data[CHUNK_NX];
+ hsize_t offset[1];
+ size_t data_size;
+ int i;
+
+ TESTING("H5DOwrite_chunk wrapper");
+
+ /* Set the size of the chunk data */
+ data_size = CHUNK_NX * sizeof(int);
+
+ /* Initialize the chunk data */
+ for (i = 0; i < CHUNK_NX; i++)
+ chunk_data[i] = (i * 10) + i;
+
+ /* Write the direct chunk data repeatedly to cover all the chunks in the
+ * dataset, using the direct writing function.
+ */
+ offset[0] = 0;
+ for (i = 0; i < NX/CHUNK_NX; i++) {
+ if (H5DOwrite_chunk(did, H5P_DEFAULT, filter_mask, offset, data_size, chunk_data) < 0)
+ TEST_ERROR
+ offset[0] += CHUNK_NX;
+ }
+
+ PASSED();
+ return 0;
+
+error:
+ H5_FAILED();
+ return 1;
+} /* test_direct_chunk_write() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: test_direct_chunk_read
+ *
+ * Purpose: Test the basic functionality of H5DOread_chunk
+ *
+ * Return: Success: 0
+ * Failure: 1
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+test_direct_chunk_read(hid_t did)
+{
+ hid_t mem_sid = H5I_INVALID_HID;
+ hid_t file_sid = H5I_INVALID_HID;
+ hsize_t dims[1] = {NX};
+ hsize_t chunk_dims[1] = {CHUNK_NX};
+
+ unsigned filter_mask;
+ int chunk_data[CHUNK_NX]; /* Chunk read with H5DOread_chunk */
+ int check[CHUNK_NX]; /* Chunk read with H5Dread */
+ hsize_t offset[1];
+
+ hsize_t start[1]; /* Start of hyperslab */
+ hsize_t stride[1]; /* Stride of hyperslab */
+ hsize_t count[1]; /* Block count */
+ hsize_t block[1]; /* Block sizes */
+
+ int i,j;
+
+ TESTING("H5DOread_chunk wrapper");
+
+ /* Create dataspaces for reading */
+ if ((mem_sid = H5Screate_simple(1, chunk_dims, NULL)) < 0)
+ TEST_ERROR
+ if ((file_sid = H5Screate_simple(1, dims, NULL)) < 0)
+ TEST_ERROR
+
+ /* For each chunk in the dataset, compare the result of H5Dread and H5DOread_chunk. */
+ for (i = 0; i < NX/CHUNK_NX; i++) {
+
+ /* Select hyperslab for one chunk in the file */
+ start[0] = (hsize_t)i * CHUNK_NX;
+ stride[0] = 1;
+ count[0] = 1;
+ block[0] = CHUNK_NX;
+
+ /* Hyperslab selection equals single chunk */
+ if (H5Sselect_hyperslab(file_sid, H5S_SELECT_SET, start, stride, count, block) < 0)
+ TEST_ERROR
+
+ /* Read the chunk back */
+ if (H5Dread(did, H5T_NATIVE_INT, mem_sid, file_sid, H5P_DEFAULT, check) < 0)
+ TEST_ERROR
+
+ /* Read the raw chunk back */
+ HDmemset(chunk_data, 0, CHUNK_NX * sizeof(int));
+ filter_mask = UINT_MAX;
+ offset[0] = (hsize_t)i * CHUNK_NX;
+ if (H5DOread_chunk(did, H5P_DEFAULT, offset, &filter_mask, chunk_data) < 0)
+ TEST_ERROR
+
+ /* Check filter mask return value */
+ if (filter_mask != 0)
+ TEST_ERROR
+
+ /* Check that the values are correct */
+ for (j = 0; j < CHUNK_NX; j++)
+ if (chunk_data[i] != check[i])
+ TEST_ERROR
+ }
+
+ /* Close */
+ if (H5Sclose(mem_sid) < 0)
+ TEST_ERROR
+ if (H5Sclose(file_sid) < 0)
+ TEST_ERROR
+
+ PASSED();
+ return 0;
+
+error:
+ H5E_BEGIN_TRY {
+ H5Sclose(mem_sid);
+ H5Sclose(file_sid);
+ } H5E_END_TRY;
+
+ H5_FAILED();
+ return 1;
+} /* test_direct_chunk_read() */
+
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+
+
+/*-------------------------------------------------------------------------
+ * Function: main
+ *
+ * Purpose: Test direct chunk write function H5DOwrite_chunk and
+ * chunk direct read function H5DOread_chunk
+ *
+ * Return: Success: 0
+ * Failure: 1
+ *
+ *-------------------------------------------------------------------------
+ */
+int main( void )
+{
+#ifdef H5_NO_DEPRECATED_SYMBOLS
+
+ HDputs("Direct chunk read/write wrapper tests SKIPPED.");
+ HDputs("(Backward compatibility not configured)");
+ return EXIT_SUCCESS;
+
+#else
+
+ hid_t fid = H5I_INVALID_HID;
+ hid_t did = H5I_INVALID_HID;
+ int nerrors = 0;
+
+ if ((fid = H5Fcreate(FILE_NAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+ goto error;
+
+ if ((did = create_dataset(fid)) < 0)
+ goto error;
+
+ nerrors += test_direct_chunk_write(did);
+ nerrors += test_direct_chunk_read(did);
+
+ if (H5Dclose(did) < 0)
+ goto error;
+ if (H5Fclose(fid) < 0)
+ goto error;
+
+ /* check for errors */
+ if (nerrors)
+ goto error;
+
+ HDputs("All direct chunk read/write wrapper tests passed.");
+ return EXIT_SUCCESS;
+
+error:
+ HDputs("*** TESTS FAILED ***");
+ return EXIT_FAILURE;
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+} /* end main() */
diff --git a/src/H5CX.c b/src/H5CX.c
index deaf1a1..f809d1c 100644
--- a/src/H5CX.c
+++ b/src/H5CX.c
@@ -233,24 +233,10 @@ typedef struct H5CX_t {
hbool_t data_transform_valid; /* Whether data transform info is valid */
H5T_vlen_alloc_info_t vl_alloc_info; /* VL datatype alloc info (H5D_XFER_VLEN_*_NAME) */
hbool_t vl_alloc_info_valid; /* Whether VL datatype alloc info is valid */
- hbool_t dcr_flag; /* Direct chunk read flag (H5D_XFER_DIRECT_CHUNK_READ_FLAG_NAME) */
- hbool_t dcr_flag_valid; /* Whether direct chunk read flag is valid */
- hsize_t *dcr_offset; /* Direct chunk read offset (H5D_XFER_DIRECT_CHUNK_READ_OFFSET_NAME) */
- hbool_t dcr_offset_valid; /* Whether direct chunk read offset is valid */
- hbool_t dcw_flag; /* Direct chunk write flag (H5D_XFER_DIRECT_CHUNK_WRITE_FLAG_NAME) */
- hbool_t dcw_flag_valid; /* Whether direct chunk write flag is valid */
- uint32_t dcw_filters; /* Direct chunk write filter flags (H5D_XFER_DIRECT_CHUNK_WRITE_FILTERS_NAME) */
- hbool_t dcw_filters_valid; /* Whether direct chunk write filter flags is valid */
- hsize_t *dcw_offset; /* Direct chunk write offset (H5D_XFER_DIRECT_CHUNK_WRITE_OFFSET_NAME) */
- hbool_t dcw_offset_valid; /* Whether direct chunk write offset is valid */
- uint32_t dcw_datasize; /* Direct chunk write data size (H5D_XFER_DIRECT_CHUNK_WRITE_DATASIZE_NAME) */
- hbool_t dcw_datasize_valid; /* Whether direct chunk write data size is valid */
H5T_conv_cb_t dt_conv_cb; /* Datatype conversion struct (H5D_XFER_CONV_CB_NAME) */
hbool_t dt_conv_cb_valid; /* Whether datatype conversion struct is valid */
/* Return-only DXPL properties to return to application */
- uint32_t dcr_filters; /* Direct chunk read filter flags (H5D_XFER_DIRECT_CHUNK_READ_FILTERS_NAME) */
- hbool_t dcr_filters_set; /* Whether direct chunk read filter flags are set */
#ifdef H5_HAVE_PARALLEL
H5D_mpio_actual_chunk_opt_mode_t mpio_actual_chunk_opt; /* Chunk optimization mode used for parallel I/O (H5D_MPIO_ACTUAL_CHUNK_OPT_MODE_NAME) */
hbool_t mpio_actual_chunk_opt_set; /* Whether chunk optimization mode used for parallel I/O is set */
@@ -321,12 +307,6 @@ typedef struct H5CX_dxpl_cache_t {
H5Z_cb_t filter_cb; /* Filter callback function (H5D_XFER_FILTER_CB_NAME) */
H5Z_data_xform_t *data_transform; /* Data transform info (H5D_XFER_XFORM_NAME) */
H5T_vlen_alloc_info_t vl_alloc_info; /* VL datatype alloc info (H5D_XFER_VLEN_*_NAME) */
- hbool_t dcr_flag; /* Direct chunk read flag (H5D_XFER_DIRECT_CHUNK_READ_FLAG_NAME) */
- hsize_t *dcr_offset; /* Direct chunk read offset (H5D_XFER_DIRECT_CHUNK_READ_OFFSET_NAME) */
- hbool_t dcw_flag; /* Direct chunk write flag (H5D_XFER_DIRECT_CHUNK_WRITE_FLAG_NAME) */
- uint32_t dcw_datasize; /* Direct chunk write data size (H5D_XFER_DIRECT_CHUNK_WRITE_DATASIZE_NAME) */
- hsize_t *dcw_offset; /* Direct chunk write offset (H5D_XFER_DIRECT_CHUNK_WRITE_OFFSET_NAME) */
- uint32_t dcw_filters; /* Direct chunk write filter flags (H5D_XFER_DIRECT_CHUNK_WRITE_FILTERS_NAME) */
H5T_conv_cb_t dt_conv_cb; /* Datatype conversion struct (H5D_XFER_CONV_CB_NAME) */
} H5CX_dxpl_cache_t;
@@ -469,27 +449,10 @@ H5CX__init_package(void)
if(H5P_get(dx_plist, H5D_XFER_VLEN_FREE_INFO_NAME, &H5CX_def_dxpl_cache.vl_alloc_info.free_info) < 0)
HGOTO_ERROR(H5E_CONTEXT, H5E_CANTGET, FAIL, "Can't retrieve VL datatype alloc info")
- /* Get direct chunk read info */
- if(H5P_get(dx_plist, H5D_XFER_DIRECT_CHUNK_READ_FLAG_NAME, &H5CX_def_dxpl_cache.dcr_flag) < 0)
- HGOTO_ERROR(H5E_CONTEXT, H5E_CANTGET, FAIL, "Can't retrieve direct chunk read flag")
- if(H5P_get(dx_plist, H5D_XFER_DIRECT_CHUNK_READ_OFFSET_NAME, &H5CX_def_dxpl_cache.dcr_offset) < 0)
- HGOTO_ERROR(H5E_CONTEXT, H5E_CANTGET, FAIL, "Can't retrieve direct chunk read offset")
-
- /* Get direct chunk write info */
- if(H5P_get(dx_plist, H5D_XFER_DIRECT_CHUNK_WRITE_FLAG_NAME, &H5CX_def_dxpl_cache.dcw_flag) < 0)
- HGOTO_ERROR(H5E_CONTEXT, H5E_CANTGET, FAIL, "Can't retrieve direct chunk write flag")
- if(H5P_get(dx_plist, H5D_XFER_DIRECT_CHUNK_WRITE_FILTERS_NAME, &H5CX_def_dxpl_cache.dcw_filters) < 0)
- HGOTO_ERROR(H5E_CONTEXT, H5E_CANTGET, FAIL, "Can't retrieve direct chunk write filter mask")
- if(H5P_get(dx_plist, H5D_XFER_DIRECT_CHUNK_WRITE_OFFSET_NAME, &H5CX_def_dxpl_cache.dcw_offset) < 0)
- HGOTO_ERROR(H5E_CONTEXT, H5E_CANTGET, FAIL, "Can't retrieve direct chunk write offset")
- if(H5P_get(dx_plist, H5D_XFER_DIRECT_CHUNK_WRITE_DATASIZE_NAME, &H5CX_def_dxpl_cache.dcw_datasize) < 0)
- HGOTO_ERROR(H5E_CONTEXT, H5E_CANTGET, FAIL, "Can't retrieve direct chunk write data size")
-
/* Get datatype conversion struct */
if(H5P_get(dx_plist, H5D_XFER_CONV_CB_NAME, &H5CX_def_dxpl_cache.dt_conv_cb) < 0)
HGOTO_ERROR(H5E_CONTEXT, H5E_CANTGET, FAIL, "Can't retrieve datatype conversion exception callback")
-
/* Reset the "default LAPL cache" information */
HDmemset(&H5CX_def_lapl_cache, 0, sizeof(H5CX_lapl_cache_t));
@@ -1791,216 +1754,6 @@ done:
/*-------------------------------------------------------------------------
- * Function: H5CX_get_dcr_flag
- *
- * Purpose: Retrieves the direct chunk read flag for the current API call context.
- *
- * Return: Non-negative on success / Negative on failure
- *
- * Programmer: Quincey Koziol
- * March 6, 2018
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5CX_get_dcr_flag(hbool_t *dcr_flag)
-{
- H5CX_node_t **head = H5CX_get_my_context(); /* Get the pointer to the head of the API context, for this thread */
- herr_t ret_value = SUCCEED; /* Return value */
-
- FUNC_ENTER_NOAPI(FAIL)
-
- /* Sanity check */
- HDassert(dcr_flag);
- HDassert(head && *head);
- HDassert(H5P_DEFAULT != (*head)->ctx.dxpl_id);
-
- H5CX_RETRIEVE_PROP_VALID(dxpl, H5P_DATASET_XFER_DEFAULT, H5D_XFER_DIRECT_CHUNK_READ_FLAG_NAME, dcr_flag)
-
- /* Get the value */
- *dcr_flag = (*head)->ctx.dcr_flag;
-
-done:
- FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5CX_get_dcr_flag() */
-
-
-/*-------------------------------------------------------------------------
- * Function: H5CX_get_dcr_offset
- *
- * Purpose: Retrieves the direct chunk read offset for the current API call context.
- *
- * Return: Non-negative on success / Negative on failure
- *
- * Programmer: Quincey Koziol
- * March 6, 2018
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5CX_get_dcr_offset(hsize_t **dcr_offset)
-{
- H5CX_node_t **head = H5CX_get_my_context(); /* Get the pointer to the head of the API context, for this thread */
- herr_t ret_value = SUCCEED; /* Return value */
-
- FUNC_ENTER_NOAPI(FAIL)
-
- /* Sanity check */
- HDassert(dcr_offset);
- HDassert(head && *head);
- HDassert(H5P_DEFAULT != (*head)->ctx.dxpl_id);
-
- H5CX_RETRIEVE_PROP_VALID(dxpl, H5P_DATASET_XFER_DEFAULT, H5D_XFER_DIRECT_CHUNK_READ_OFFSET_NAME, dcr_offset)
-
- /* Get the value */
- *dcr_offset = (*head)->ctx.dcr_offset;
-
-done:
- FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5CX_get_dcr_offset() */
-
-
-/*-------------------------------------------------------------------------
- * Function: H5CX_get_dcw_flag
- *
- * Purpose: Retrieves the direct chunk write flag for the current API call context.
- *
- * Return: Non-negative on success / Negative on failure
- *
- * Programmer: Quincey Koziol
- * March 6, 2018
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5CX_get_dcw_flag(hbool_t *dcw_flag)
-{
- H5CX_node_t **head = H5CX_get_my_context(); /* Get the pointer to the head of the API context, for this thread */
- herr_t ret_value = SUCCEED; /* Return value */
-
- FUNC_ENTER_NOAPI(FAIL)
-
- /* Sanity check */
- HDassert(dcw_flag);
- HDassert(head && *head);
- HDassert(H5P_DEFAULT != (*head)->ctx.dxpl_id);
-
- H5CX_RETRIEVE_PROP_VALID(dxpl, H5P_DATASET_XFER_DEFAULT, H5D_XFER_DIRECT_CHUNK_WRITE_FLAG_NAME, dcw_flag)
-
- /* Get the value */
- *dcw_flag = (*head)->ctx.dcw_flag;
-
-done:
- FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5CX_get_dcw_flag() */
-
-
-/*-------------------------------------------------------------------------
- * Function: H5CX_get_dcw_filters
- *
- * Purpose: Retrieves the direct chunk write filter mask for the current API call context.
- *
- * Return: Non-negative on success / Negative on failure
- *
- * Programmer: Quincey Koziol
- * March 6, 2018
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5CX_get_dcw_filters(uint32_t *dcw_filters)
-{
- H5CX_node_t **head = H5CX_get_my_context(); /* Get the pointer to the head of the API context, for this thread */
- herr_t ret_value = SUCCEED; /* Return value */
-
- FUNC_ENTER_NOAPI(FAIL)
-
- /* Sanity check */
- HDassert(dcw_filters);
- HDassert(head && *head);
- HDassert(H5P_DEFAULT != (*head)->ctx.dxpl_id);
-
- H5CX_RETRIEVE_PROP_VALID(dxpl, H5P_DATASET_XFER_DEFAULT, H5D_XFER_DIRECT_CHUNK_WRITE_FILTERS_NAME, dcw_filters)
-
- /* Get the value */
- *dcw_filters = (*head)->ctx.dcw_filters;
-
-done:
- FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5CX_get_dcw_filters() */
-
-
-/*-------------------------------------------------------------------------
- * Function: H5CX_get_dcw_offset
- *
- * Purpose: Retrieves the direct chunk write offset for the current API call context.
- *
- * Return: Non-negative on success / Negative on failure
- *
- * Programmer: Quincey Koziol
- * March 6, 2018
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5CX_get_dcw_offset(hsize_t **dcw_offset)
-{
- H5CX_node_t **head = H5CX_get_my_context(); /* Get the pointer to the head of the API context, for this thread */
- herr_t ret_value = SUCCEED; /* Return value */
-
- FUNC_ENTER_NOAPI(FAIL)
-
- /* Sanity check */
- HDassert(dcw_offset);
- HDassert(head && *head);
- HDassert(H5P_DEFAULT != (*head)->ctx.dxpl_id);
-
- H5CX_RETRIEVE_PROP_VALID(dxpl, H5P_DATASET_XFER_DEFAULT, H5D_XFER_DIRECT_CHUNK_WRITE_OFFSET_NAME, dcw_offset)
-
- /* Get the value */
- *dcw_offset = (*head)->ctx.dcw_offset;
-
-done:
- FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5CX_get_dcw_offset() */
-
-
-/*-------------------------------------------------------------------------
- * Function: H5CX_get_dcw_datasize
- *
- * Purpose: Retrieves the direct chunk write data size for the current API call context.
- *
- * Return: Non-negative on success / Negative on failure
- *
- * Programmer: Quincey Koziol
- * March 6, 2018
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5CX_get_dcw_datasize(uint32_t *dcw_datasize)
-{
- H5CX_node_t **head = H5CX_get_my_context(); /* Get the pointer to the head of the API context, for this thread */
- herr_t ret_value = SUCCEED; /* Return value */
-
- FUNC_ENTER_NOAPI(FAIL)
-
- /* Sanity check */
- HDassert(dcw_datasize);
- HDassert(head && *head);
- HDassert(H5P_DEFAULT != (*head)->ctx.dxpl_id);
-
- H5CX_RETRIEVE_PROP_VALID(dxpl, H5P_DATASET_XFER_DEFAULT, H5D_XFER_DIRECT_CHUNK_WRITE_DATASIZE_NAME, dcw_datasize)
-
- /* Get the value */
- *dcw_datasize = (*head)->ctx.dcw_datasize;
-
-done:
- FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5CX_get_dcw_datasize() */
-
-
-/*-------------------------------------------------------------------------
* Function: H5CX_get_dt_conv_cb
*
* Purpose: Retrieves the datatype conversion exception callback for the current API call context.
@@ -2358,38 +2111,6 @@ done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5CX_set_nlinks() */
-
-/*-------------------------------------------------------------------------
- * Function: H5CX_set_dcr_filters
- *
- * Purpose: Sets the direct chunk read filter flags for the current API call context.
- *
- * Return: <none>
- *
- * Programmer: Quincey Koziol
- * March 6, 2018
- *
- *-------------------------------------------------------------------------
- */
-void
-H5CX_set_dcr_filters(uint32_t direct_filters)
-{
- H5CX_node_t **head = H5CX_get_my_context(); /* Get the pointer to the head of the API context, for this thread */
-
- FUNC_ENTER_NOAPI_NOINIT_NOERR
-
- /* Sanity checks */
- HDassert(head && *head);
- HDassert(!((*head)->ctx.dxpl_id == H5P_DEFAULT ||
- (*head)->ctx.dxpl_id == H5P_DATASET_XFER_DEFAULT));
-
- /* Cache the filter mask for later, marking it to set in DXPL when context popped */
- (*head)->ctx.dcr_filters = direct_filters;
- (*head)->ctx.dcr_filters_set = TRUE;
-
- FUNC_LEAVE_NOAPI_VOID
-} /* end H5CX_set_dcr_filters() */
-
#ifdef H5_HAVE_PARALLEL
/*-------------------------------------------------------------------------
@@ -2755,7 +2476,6 @@ H5CX__pop_common(void)
HDassert(head && *head);
/* Check for cached DXPL properties to return to application */
- H5CX_SET_PROP(H5D_XFER_DIRECT_CHUNK_READ_FILTERS_NAME, dcr_filters)
#ifdef H5_HAVE_PARALLEL
H5CX_SET_PROP(H5D_MPIO_ACTUAL_CHUNK_OPT_MODE_NAME, mpio_actual_chunk_opt)
H5CX_SET_PROP(H5D_MPIO_ACTUAL_IO_MODE_NAME, mpio_actual_io_mode)
diff --git a/src/H5CXprivate.h b/src/H5CXprivate.h
index 3566f11..44a4067 100644
--- a/src/H5CXprivate.h
+++ b/src/H5CXprivate.h
@@ -95,12 +95,6 @@ H5_DLL herr_t H5CX_get_err_detect(H5Z_EDC_t *err_detect);
H5_DLL herr_t H5CX_get_filter_cb(H5Z_cb_t *filter_cb);
H5_DLL herr_t H5CX_get_data_transform(H5Z_data_xform_t **data_transform);
H5_DLL herr_t H5CX_get_vlen_alloc_info(H5T_vlen_alloc_info_t *vl_alloc_info);
-H5_DLL herr_t H5CX_get_dcr_flag(hbool_t *direct_read);
-H5_DLL herr_t H5CX_get_dcr_offset(hsize_t **direct_offset);
-H5_DLL herr_t H5CX_get_dcw_flag(hbool_t *direct_write);
-H5_DLL herr_t H5CX_get_dcw_filters(uint32_t *direct_filters);
-H5_DLL herr_t H5CX_get_dcw_offset(hsize_t **direct_offset);
-H5_DLL herr_t H5CX_get_dcw_datasize(uint32_t *direct_datasize);
H5_DLL herr_t H5CX_get_dt_conv_cb(H5T_conv_cb_t *cb_struct);
/* "Getter" routines for LAPL properties cached in API context */
@@ -127,7 +121,6 @@ H5_DLL herr_t H5CX_set_vlen_alloc_info(H5MM_allocate_t alloc_func,
H5_DLL herr_t H5CX_set_nlinks(size_t nlinks);
/* "Setter" routines for cached DXPL properties that must be returned to application */
-H5_DLL void H5CX_set_dcr_filters(uint32_t direct_filters);
#ifdef H5_HAVE_PARALLEL
H5_DLL void H5CX_set_mpio_actual_chunk_opt(H5D_mpio_actual_chunk_opt_mode_t chunk_opt);
H5_DLL void H5CX_set_mpio_actual_io_mode(H5D_mpio_actual_io_mode_t actual_io_mode);
diff --git a/src/H5Dio.c b/src/H5Dio.c
index 1566b5e..452105e 100644
--- a/src/H5Dio.c
+++ b/src/H5Dio.c
@@ -50,7 +50,8 @@
/* Local Prototypes */
/********************/
-/* Setup/teardown routines */
+static herr_t H5D__get_offset_copy(const H5D_t *dset, const hsize_t *offset,
+ hsize_t *offset_copy/*out*/);
static herr_t H5D__ioinfo_init(H5D_t *dset, const H5D_type_info_t *type_info,
H5D_storage_t *store, H5D_io_info_t *io_info);
static herr_t H5D__typeinfo_init(const H5D_t *dset, hid_t mem_type_id,
@@ -80,32 +81,81 @@ H5FL_DEFINE(H5D_chunk_map_t);
/*-------------------------------------------------------------------------
+ * Function: H5D__get_offset_copy
+ *
+ * Purpose: Gets a copy of the user's offset array that is guaraneteed
+ * to be suitable for use by the library.
+ *
+ * Return: SUCCEED/FAIL
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__get_offset_copy(const H5D_t *dset, const hsize_t *offset, hsize_t *offset_copy)
+{
+ unsigned u;
+ herr_t ret_value = SUCCEED; /* Return value */
+
+ FUNC_ENTER_NOAPI(FAIL)
+
+ HDassert(dset);
+ HDassert(offset);
+ HDassert(offset_copy);
+
+
+ /* The library's chunking code requires the offset to terminate with a zero.
+ * So transfer the offset array to an internal offset array that we
+ * can properly terminate (handled via the calloc call).
+ */
+
+ HDmemset(offset_copy, 0, H5O_LAYOUT_NDIMS * sizeof(hsize_t));
+
+ for (u = 0; u < dset->shared->ndims; u++) {
+ /* Make sure the offset doesn't exceed the dataset's dimensions */
+ if (offset[u] > dset->shared->curr_dims[u])
+ HGOTO_ERROR(H5E_DATASPACE, H5E_BADTYPE, FAIL, "offset exceeds dimensions of dataset")
+
+ /* Make sure the offset fall right on a chunk's boundary */
+ if (offset[u] % dset->shared->layout.u.chunk.dim[u])
+ HGOTO_ERROR(H5E_DATASPACE, H5E_BADTYPE, FAIL, "offset doesn't fall on chunks's boundary")
+
+ offset_copy[u] = offset[u];
+ }
+
+done:
+ FUNC_LEAVE_NOAPI(ret_value)
+
+} /* end H5D__get_offset_copy() */
+
+
+
+/*-------------------------------------------------------------------------
* Function: H5Dread
*
- * Purpose: Reads (part of) a DSET from the file into application
- * memory BUF. The part of the dataset to read is defined with
- * MEM_SPACE_ID and FILE_SPACE_ID. The data points are
- * converted from their file type to the MEM_TYPE_ID specified.
- * Additional miscellaneous data transfer properties can be
- * passed to this function with the PLIST_ID argument.
+ * Purpose: Reads (part of) a DSET from the file into application
+ * memory BUF. The part of the dataset to read is defined with
+ * MEM_SPACE_ID and FILE_SPACE_ID. The data points are
+ * converted from their file type to the MEM_TYPE_ID specified.
+ * Additional miscellaneous data transfer properties can be
+ * passed to this function with the PLIST_ID argument.
*
- * The FILE_SPACE_ID can be the constant H5S_ALL which indicates
- * that the entire file dataspace is to be referenced.
+ * The FILE_SPACE_ID can be the constant H5S_ALL which indicates
+ * that the entire file dataspace is to be referenced.
*
- * The MEM_SPACE_ID can be the constant H5S_ALL in which case
- * the memory dataspace is the same as the file dataspace
- * defined when the dataset was created.
+ * The MEM_SPACE_ID can be the constant H5S_ALL in which case
+ * the memory dataspace is the same as the file dataspace
+ * defined when the dataset was created.
*
- * The number of elements in the memory dataspace must match
- * the number of elements in the file dataspace.
+ * The number of elements in the memory dataspace must match
+ * the number of elements in the file dataspace.
*
- * The PLIST_ID can be the constant H5P_DEFAULT in which
- * case the default data transfer properties are used.
+ * The PLIST_ID can be the constant H5P_DEFAULT in which
+ * case the default data transfer properties are used.
*
- * Return: Non-negative on success/Negative on failure
+ * Return: Non-negative on success/Negative on failure
*
- * Programmer: Robb Matzke
- * Thursday, December 4, 1997
+ * Programmer: Robb Matzke
+ * Thursday, December 4, 1997
*
*-------------------------------------------------------------------------
*/
@@ -113,135 +163,136 @@ herr_t
H5Dread(hid_t dset_id, hid_t mem_type_id, hid_t mem_space_id,
hid_t file_space_id, hid_t dxpl_id, void *buf/*out*/)
{
- H5D_t *dset = NULL;
- const H5S_t *mem_space = NULL;
- const H5S_t *file_space = NULL;
- hbool_t direct_read = FALSE;
- herr_t ret_value = SUCCEED; /* Return value */
+ H5D_t *dset = NULL;
+ const H5S_t *mem_space = NULL;
+ const H5S_t *file_space = NULL;
+ herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE6("e", "iiiiix", dset_id, mem_type_id, mem_space_id, file_space_id,
dxpl_id, buf);
- /* check arguments */
- if(NULL == (dset = (H5D_t *)H5I_object_verify(dset_id, H5I_DATASET)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset")
- if(NULL == dset->oloc.file)
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset")
+ /* Get dataset pointer */
+ if (NULL == (dset = (H5D_t *)H5I_object_verify(dset_id, H5I_DATASET)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "dset_id is not a dataset ID")
+ if (NULL == dset->oloc.file)
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "dataset is not associated with a file")
- if(mem_space_id < 0 || file_space_id < 0)
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace")
+ /* Get validated dataspace pointers */
+ if (H5S_get_validated_dataspace(mem_space_id, &mem_space) < 0)
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "could not get a validated dataspace from mem_space_id")
+ if (H5S_get_validated_dataspace(file_space_id, &file_space) < 0)
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "could not get a validated dataspace from file_space_id")
- if(H5S_ALL != mem_space_id) {
- if(NULL == (mem_space = (const H5S_t *)H5I_object_verify(mem_space_id, H5I_DATASPACE)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace")
+ /* Get the default dataset transfer property list if the user didn't provide one */
+ if (H5P_DEFAULT == dxpl_id)
+ dxpl_id = H5P_DATASET_XFER_DEFAULT;
+ else
+ if (TRUE != H5P_isa_class(dxpl_id, H5P_DATASET_XFER))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not xfer parms")
- /* Check for valid selection */
- if(H5S_SELECT_VALID(mem_space) != TRUE)
- HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, FAIL, "selection+offset not within extent")
- } /* end if */
+ /* Set DXPL for operation */
+ H5CX_set_dxpl(dxpl_id);
- if(H5S_ALL != file_space_id) {
- if(NULL == (file_space = (const H5S_t *)H5I_object_verify(file_space_id, H5I_DATASPACE)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace")
+ /* Read raw data */
+ if (H5D__read(dset, mem_type_id, mem_space, file_space, buf/*out*/) < 0)
+ HGOTO_ERROR(H5E_DATASET, H5E_READERROR, FAIL, "can't read data")
- /* Check for valid selection */
- if(H5S_SELECT_VALID(file_space) != TRUE)
- HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, FAIL, "selection+offset not within extent")
- } /* end if */
+done:
+ FUNC_LEAVE_API(ret_value)
+} /* end H5Dread() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5Dread_chunk
+ *
+ * Purpose: Reads an entire chunk from the file directly.
+ *
+ * Return: Non-negative on success/Negative on failure
+ *
+ * Programmer: Matthew Strong (GE Healthcare)
+ * 14 February 2016
+ *
+ *---------------------------------------------------------------------------
+ */
+herr_t
+H5Dread_chunk(hid_t dset_id, hid_t dxpl_id, const hsize_t *offset, uint32_t *filters,
+ void *buf)
+{
+ H5D_t *dset = NULL;
+ hsize_t offset_copy[H5O_LAYOUT_NDIMS]; /* Internal copy of chunk offset */
+ herr_t ret_value = SUCCEED; /* Return value */
+
+ FUNC_ENTER_API(FAIL)
+ H5TRACE5("e", "ii*h*Iu*x", dset_id, dxpl_id, offset, filters, buf);
+
+ /* Check arguments */
+ if (NULL == (dset = (H5D_t *)H5I_object_verify(dset_id, H5I_DATASET)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "dset_id is not a dataset ID")
+ if (NULL == dset->oloc.file)
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "dataset is not associated with a file")
+ if (H5D_CHUNKED != dset->shared->layout.type)
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a chunked dataset")
+ if (!buf)
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "buf cannot be NULL")
+ if (!offset)
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "offset cannot be NULL")
+ if (!filters)
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "filters cannot be NULL")
/* Get the default dataset transfer property list if the user didn't provide one */
- if(H5P_DEFAULT == dxpl_id)
+ if (H5P_DEFAULT == dxpl_id)
dxpl_id = H5P_DATASET_XFER_DEFAULT;
else
- if(TRUE != H5P_isa_class(dxpl_id, H5P_DATASET_XFER))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not xfer parms")
+ if (TRUE != H5P_isa_class(dxpl_id, H5P_DATASET_XFER))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "dxpl_id is not a dataset transfer property list ID")
/* Set DXPL for operation */
H5CX_set_dxpl(dxpl_id);
- /* Retrieve the 'direct read' flag */
- if(H5CX_get_dcr_flag(&direct_read) < 0)
- HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "error getting flag for direct chunk read")
-
- /* Set up for direct read of chunk, bypassing filters, etc. */
- if(direct_read) {
- hsize_t *direct_offset; /* Chunk offset from calling routine */
- hsize_t internal_offset[H5O_LAYOUT_NDIMS]; /* Internal copy of chunk offset */
- uint32_t direct_filters = 0; /* Filters for chunk */
- unsigned u; /* Local index variable */
-
- /* Sanity check */
- if(H5D_CHUNKED != dset->shared->layout.type)
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a chunked dataset")
-
- /* Get the direct chunk offset */
- if(H5CX_get_dcr_offset(&direct_offset) < 0)
- HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "error getting offset for direct chunk read")
- HDassert(direct_offset);
-
- /* The library's chunking code requires the offset terminates with a zero. So transfer the
- * offset array to an internal offset array */
- for(u = 0; u < dset->shared->ndims; u++) {
- /* Make sure the offset doesn't exceed the dataset's dimensions */
- if(direct_offset[u] > dset->shared->curr_dims[u])
- HGOTO_ERROR(H5E_DATASPACE, H5E_BADTYPE, FAIL, "offset exceeds dimensions of dataset")
-
- /* Make sure the offset fall right on a chunk's boundary */
- if(direct_offset[u] % dset->shared->layout.u.chunk.dim[u])
- HGOTO_ERROR(H5E_DATASPACE, H5E_BADTYPE, FAIL, "offset doesn't fall on chunks's boundary")
-
- internal_offset[u] = direct_offset[u];
- } /* end for */
-
- /* Terminate the offset with a zero */
- internal_offset[dset->shared->ndims] = 0;
-
- /* Read the raw chunk */
- if(H5D__chunk_direct_read(dset, internal_offset, &direct_filters, buf) < 0)
- HGOTO_ERROR(H5E_DATASET, H5E_READERROR, FAIL, "can't read chunk directly")
-
- /* Set the chunk filter mask for application */
- H5CX_set_dcr_filters(direct_filters);
- } /* end if */
- else
- /* Read raw data */
- if(H5D__read(dset, mem_type_id, mem_space, file_space, buf/*out*/) < 0)
- HGOTO_ERROR(H5E_DATASET, H5E_READERROR, FAIL, "can't read data")
+ /* Copy the user's offset array so we can be sure it's terminated properly.
+ * (we don't want to mess with the user's buffer).
+ */
+ if (H5D__get_offset_copy(dset, offset, offset_copy) < 0)
+ HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "failure to copy offset array")
+
+ /* Read the raw chunk */
+ if (H5D__chunk_direct_read(dset, offset_copy, filters, buf) < 0)
+ HGOTO_ERROR(H5E_DATASET, H5E_READERROR, FAIL, "can't read unprocessed chunk data")
done:
FUNC_LEAVE_API(ret_value)
-} /* end H5Dread() */
+} /* end H5Dread_chunk() */
/*-------------------------------------------------------------------------
- * Function: H5Dwrite
+ * Function: H5Dwrite
*
- * Purpose: Writes (part of) a DSET from application memory BUF to the
- * file. The part of the dataset to write is defined with the
- * MEM_SPACE_ID and FILE_SPACE_ID arguments. The data points
- * are converted from their current type (MEM_TYPE_ID) to their
- * file datatype. Additional miscellaneous data transfer
- * properties can be passed to this function with the
- * PLIST_ID argument.
+ * Purpose: Writes (part of) a DSET from application memory BUF to the
+ * file. The part of the dataset to write is defined with the
+ * MEM_SPACE_ID and FILE_SPACE_ID arguments. The data points
+ * are converted from their current type (MEM_TYPE_ID) to their
+ * file datatype. Additional miscellaneous data transfer
+ * properties can be passed to this function with the
+ * PLIST_ID argument.
*
- * The FILE_SPACE_ID can be the constant H5S_ALL which indicates
- * that the entire file dataspace is to be referenced.
+ * The FILE_SPACE_ID can be the constant H5S_ALL which indicates
+ * that the entire file dataspace is to be referenced.
*
- * The MEM_SPACE_ID can be the constant H5S_ALL in which case
- * the memory dataspace is the same as the file dataspace
- * defined when the dataset was created.
+ * The MEM_SPACE_ID can be the constant H5S_ALL in which case
+ * the memory dataspace is the same as the file dataspace
+ * defined when the dataset was created.
*
- * The number of elements in the memory dataspace must match
- * the number of elements in the file dataspace.
+ * The number of elements in the memory dataspace must match
+ * the number of elements in the file dataspace.
*
- * The PLIST_ID can be the constant H5P_DEFAULT in which
- * case the default data transfer properties are used.
+ * The PLIST_ID can be the constant H5P_DEFAULT in which
+ * case the default data transfer properties are used.
*
- * Return: Non-negative on success/Negative on failure
+ * Return: Non-negative on success/Negative on failure
*
- * Programmer: Robb Matzke
- * Thursday, December 4, 1997
+ * Programmer: Robb Matzke
+ * Thursday, December 4, 1997
*
*-------------------------------------------------------------------------
*/
@@ -249,61 +300,40 @@ herr_t
H5Dwrite(hid_t dset_id, hid_t mem_type_id, hid_t mem_space_id,
hid_t file_space_id, hid_t dxpl_id, const void *buf)
{
- H5D_t *dset = NULL;
+ H5D_t *dset = NULL;
const H5S_t *mem_space = NULL;
const H5S_t *file_space = NULL;
- hbool_t direct_write = FALSE;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE6("e", "iiiii*x", dset_id, mem_type_id, mem_space_id, file_space_id,
dxpl_id, buf);
- /* check arguments */
- if(NULL == (dset = (H5D_t *)H5I_object_verify(dset_id, H5I_DATASET)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset")
- if(NULL == dset->oloc.file)
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file")
+ /* Get dataset pointer and ensure it's associated with a file */
+ if (NULL == (dset = (H5D_t *)H5I_object_verify(dset_id, H5I_DATASET)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "dset_id is not a dataset ID")
+ if (NULL == dset->oloc.file)
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "dataset is not associated with a file")
+
+ /* Get validated dataspace pointers */
+ if (H5S_get_validated_dataspace(mem_space_id, &mem_space) < 0)
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "could not get a validated dataspace from mem_space_id")
+ if (H5S_get_validated_dataspace(file_space_id, &file_space) < 0)
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "could not get a validated dataspace from file_space_id")
/* Get the default dataset transfer property list if the user didn't provide one */
- if(H5P_DEFAULT == dxpl_id)
+ if (H5P_DEFAULT == dxpl_id)
dxpl_id = H5P_DATASET_XFER_DEFAULT;
else
- if(TRUE != H5P_isa_class(dxpl_id, H5P_DATASET_XFER))
+ if (TRUE != H5P_isa_class(dxpl_id, H5P_DATASET_XFER))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not xfer parms")
/* Set DXPL for operation */
H5CX_set_dxpl(dxpl_id);
- /* Retrieve the 'direct write' flag */
- if(H5CX_get_dcw_flag(&direct_write) < 0)
- HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "error getting flag for direct chunk read")
-
- /* Check dataspace selections if this is not a direct write */
- if(!direct_write) {
- if(mem_space_id < 0 || file_space_id < 0)
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace")
-
- if(H5S_ALL != mem_space_id) {
- if(NULL == (mem_space = (const H5S_t *)H5I_object_verify(mem_space_id, H5I_DATASPACE)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace")
-
- /* Check for valid selection */
- if(H5S_SELECT_VALID(mem_space) != TRUE)
- HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, FAIL, "memory selection+offset not within extent")
- } /* end if */
- if(H5S_ALL != file_space_id) {
- if(NULL == (file_space = (const H5S_t *)H5I_object_verify(file_space_id, H5I_DATASPACE)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace")
-
- /* Check for valid selection */
- if(H5S_SELECT_VALID(file_space) != TRUE)
- HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, FAIL, "file selection+offset not within extent")
- } /* end if */
- } /* end if */
-
- if(H5D__pre_write(dset, direct_write, mem_type_id, mem_space, file_space, buf) < 0)
- HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "can't prepare for writing data")
+ /* Write the data */
+ if (H5D__write(dset, mem_type_id, mem_space, file_space, buf) < 0)
+ HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "can't write data")
done:
FUNC_LEAVE_API(ret_value)
@@ -311,70 +341,71 @@ done:
/*-------------------------------------------------------------------------
- * Function: H5D__pre_write
+ * Function: H5Dwrite_chunk
*
- * Purpose: Preparation for writing data.
+ * Purpose: Writes an entire chunk to the file directly.
*
- * Return: SUCCEED/FAIL
+ * Return: Non-negative on success/Negative on failure
+ *
+ * Programmer: Raymond Lu
+ * 30 July 2012
*
*-------------------------------------------------------------------------
*/
herr_t
-H5D__pre_write(H5D_t *dset, hbool_t direct_write, hid_t mem_type_id,
- const H5S_t *mem_space, const H5S_t *file_space, const void *buf)
+H5Dwrite_chunk(hid_t dset_id, hid_t dxpl_id, uint32_t filters, const hsize_t *offset,
+ size_t data_size, const void *buf)
{
- herr_t ret_value = SUCCEED; /* Return value */
+ H5D_t *dset = NULL;
+ hsize_t offset_copy[H5O_LAYOUT_NDIMS]; /* Internal copy of chunk offset */
+ uint32_t data_size_32; /* Chunk data size (limited to 32-bits currently) */
+ herr_t ret_value = SUCCEED; /* Return value */
+
+ FUNC_ENTER_API(FAIL)
+ H5TRACE6("e", "iiIu*hz*x", dset_id, dxpl_id, filters, offset, data_size, buf);
+
+ /* Check arguments */
+ if (NULL == (dset = (H5D_t *)H5I_object_verify(dset_id, H5I_DATASET)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid dataset ID")
+ if (NULL == dset->oloc.file)
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "dataset is not associated with a file")
+ if (H5D_CHUNKED != dset->shared->layout.type)
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a chunked dataset")
+ if (!buf)
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "buf cannot be NULL")
+ if (!offset)
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "offset cannot be NULL")
+ if (0 == data_size)
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "data_size cannot be zero")
+
+ /* Make sure data size is less than 4 GiB */
+ data_size_32 = (uint32_t)data_size;
+ if (data_size != (size_t)data_size_32)
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid data_size - chunks cannot be > 4 GiB")
- FUNC_ENTER_PACKAGE_VOL
-
- /* Direct chunk write */
- if(direct_write) {
- uint32_t direct_filters;
- hsize_t *direct_offset;
- uint32_t direct_datasize;
- hsize_t internal_offset[H5O_LAYOUT_NDIMS];
- unsigned u; /* Local index variable */
-
- if(H5D_CHUNKED != dset->shared->layout.type)
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a chunked dataset")
-
- /* Retrieve parameters for direct chunk write */
- if(H5CX_get_dcw_filters(&direct_filters) < 0)
- HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "error getting filter info for direct chunk write")
- if(H5CX_get_dcw_offset(&direct_offset) < 0)
- HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "error getting offset info for direct chunk write")
- if(H5CX_get_dcw_datasize(&direct_datasize) < 0)
- HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "error getting data size for direct chunk write")
-
- /* The library's chunking code requires the offset terminates with a zero. So transfer the
- * offset array to an internal offset array */
- for(u = 0; u < dset->shared->ndims; u++) {
- /* Make sure the offset doesn't exceed the dataset's dimensions */
- if(direct_offset[u] > dset->shared->curr_dims[u])
- HGOTO_ERROR(H5E_DATASPACE, H5E_BADTYPE, FAIL, "offset exceeds dimensions of dataset")
-
- /* Make sure the offset fall right on a chunk's boundary */
- if(direct_offset[u] % dset->shared->layout.u.chunk.dim[u])
- HGOTO_ERROR(H5E_DATASPACE, H5E_BADTYPE, FAIL, "offset doesn't fall on chunks's boundary")
-
- internal_offset[u] = direct_offset[u];
- } /* end for */
-
- /* Terminate the offset with a zero */
- internal_offset[dset->shared->ndims] = 0;
-
- /* write raw data */
- if(H5D__chunk_direct_write(dset, direct_filters, internal_offset, direct_datasize, buf) < 0)
- HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "can't write chunk directly")
- } /* end if */
+ /* Get the default dataset transfer property list if the user didn't provide one */
+ if (H5P_DEFAULT == dxpl_id)
+ dxpl_id = H5P_DATASET_XFER_DEFAULT;
else
- /* Normal write of raw data */
- if(H5D__write(dset, mem_type_id, mem_space, file_space, buf) < 0)
- HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "can't write data")
+ if (TRUE != H5P_isa_class(dxpl_id, H5P_DATASET_XFER))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "dxpl_id is not a dataset transfer property list ID")
+
+ /* Set DXPL for operation */
+ H5CX_set_dxpl(dxpl_id);
+
+ /* Copy the user's offset array so we can be sure it's terminated properly.
+ * (we don't want to mess with the user's buffer).
+ */
+ if (H5D__get_offset_copy(dset, offset, offset_copy) < 0)
+ HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "failure to copy offset array")
+
+ /* Write chunk */
+ if (H5D__chunk_direct_write(dset, filters, offset_copy, data_size_32, buf) < 0)
+ HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "can't write unprocessed chunk data")
done:
- FUNC_LEAVE_NOAPI_VOL(ret_value)
-} /* end H5D__pre_write() */
+ FUNC_LEAVE_API(ret_value)
+} /* end H5Dwrite_chunk() */
/*-------------------------------------------------------------------------
@@ -400,7 +431,7 @@ H5D__read(H5D_t *dataset, hid_t mem_type_id, const H5S_t *mem_space,
hbool_t type_info_init = FALSE; /* Whether the datatype info has been initialized */
H5S_t * projected_mem_space = NULL; /* If not NULL, ptr to dataspace containing a */
/* projection of the supplied mem_space to a new */
- /* dataspace with rank equal to that of */
+ /* dataspace with rank equal to that of */
/* file_space. */
/* */
/* This field is only used if */
@@ -428,7 +459,7 @@ H5D__read(H5D_t *dataset, hid_t mem_type_id, const H5S_t *mem_space,
if(!mem_space)
mem_space = file_space;
if((snelmts = H5S_GET_SELECT_NPOINTS(mem_space)) < 0)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "dst dataspace has invalid selection")
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "dst dataspace has invalid selection")
H5_CHECKED_ASSIGN(nelmts, hsize_t, snelmts, hssize_t);
/* Set up datatype info for operation */
@@ -612,7 +643,7 @@ H5D__write(H5D_t *dataset, hid_t mem_type_id, const H5S_t *mem_space,
hbool_t type_info_init = FALSE; /* Whether the datatype info has been initialized */
H5S_t * projected_mem_space = NULL; /* If not NULL, ptr to dataspace containing a */
/* projection of the supplied mem_space to a new */
- /* dataspace with rank equal to that of */
+ /* dataspace with rank equal to that of */
/* file_space. */
/* */
/* This field is only used if */
@@ -645,7 +676,7 @@ H5D__write(H5D_t *dataset, hid_t mem_type_id, const H5S_t *mem_space,
/* Check if we are allowed to write to this file */
if(0 == (H5F_INTENT(dataset->oloc.file) & H5F_ACC_RDWR))
- HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "no write intent on file")
+ HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "no write intent on file")
/* Set up datatype info for operation */
if(H5D__typeinfo_init(dataset, mem_type_id, TRUE, &type_info) < 0)
@@ -691,12 +722,12 @@ H5D__write(H5D_t *dataset, hid_t mem_type_id, const H5S_t *mem_space,
mem_space = file_space;
if((snelmts = H5S_GET_SELECT_NPOINTS(mem_space)) < 0)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "src dataspace has invalid selection")
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "src dataspace has invalid selection")
H5_CHECKED_ASSIGN(nelmts, hsize_t, snelmts, hssize_t);
/* Make certain that the number of elements in each selection is the same */
if(nelmts != (hsize_t)H5S_GET_SELECT_NPOINTS(file_space))
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "src and dest dataspaces have different number of elements selected")
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "src and dest dataspaces have different number of elements selected")
/* Check for a NULL buffer, after the H5S_ALL dataspace selection has been handled */
if(NULL == buf) {
@@ -934,7 +965,7 @@ H5D__typeinfo_init(const H5D_t *dset, hid_t mem_type_id, hbool_t do_write,
/* Get the memory & dataset datatypes */
if(NULL == (type_info->mem_type = (const H5T_t *)H5I_object_verify(mem_type_id, H5I_DATATYPE)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
type_info->dset_type = dset->shared->type;
if(do_write) {
@@ -959,11 +990,11 @@ H5D__typeinfo_init(const H5D_t *dset, hid_t mem_type_id, hbool_t do_write,
* turns off background preservation.
*/
if(NULL == (type_info->tpath = H5T_path_find(src_type, dst_type)))
- HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, FAIL, "unable to convert between src and dest datatype")
+ HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, FAIL, "unable to convert between src and dest datatype")
/* Retrieve info from API context */
if(H5CX_get_data_transform(&data_transform) < 0)
- HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get data transform info")
+ HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get data transform info")
/* Precompute some useful information */
type_info->src_type_size = H5T_get_size(src_type);
diff --git a/src/H5Dpkg.h b/src/H5Dpkg.h
index 126a3c0..b887b87 100644
--- a/src/H5Dpkg.h
+++ b/src/H5Dpkg.h
@@ -583,8 +583,6 @@ H5_DLL herr_t H5D__refresh(hid_t dset_id, H5D_t *dataset);
H5_DLL herr_t H5D__format_convert(H5D_t *dataset);
/* Internal I/O routines */
-H5_DLL herr_t H5D__pre_write(H5D_t *dset, hbool_t direct_write, hid_t mem_type_id,
- const H5S_t *mem_space, const H5S_t *file_space, const void *buf);
H5_DLL herr_t H5D__read(H5D_t *dataset, hid_t mem_type_id,
const H5S_t *mem_space, const H5S_t *file_space, void *buf/*out*/);
H5_DLL herr_t H5D__write(H5D_t *dataset, hid_t mem_type_id,
diff --git a/src/H5Dpublic.h b/src/H5Dpublic.h
index 790674a..a1ccda0 100644
--- a/src/H5Dpublic.h
+++ b/src/H5Dpublic.h
@@ -35,17 +35,6 @@
/* Bit flags for the H5Pset_chunk_opts() and H5Pget_chunk_opts() */
#define H5D_CHUNK_DONT_FILTER_PARTIAL_CHUNKS (0x0002u)
-/* Property names for H5DOwrite_chunk */
-#define H5D_XFER_DIRECT_CHUNK_WRITE_FLAG_NAME "direct_chunk_flag"
-#define H5D_XFER_DIRECT_CHUNK_WRITE_FILTERS_NAME "direct_chunk_filters"
-#define H5D_XFER_DIRECT_CHUNK_WRITE_OFFSET_NAME "direct_chunk_offset"
-#define H5D_XFER_DIRECT_CHUNK_WRITE_DATASIZE_NAME "direct_chunk_datasize"
-
-/* Property names for H5DOread_chunk */
-#define H5D_XFER_DIRECT_CHUNK_READ_FLAG_NAME "direct_chunk_read_flag"
-#define H5D_XFER_DIRECT_CHUNK_READ_OFFSET_NAME "direct_chunk_read_offset"
-#define H5D_XFER_DIRECT_CHUNK_READ_FILTERS_NAME "direct_chunk_read_filters"
-
/*******************/
/* Public Typedefs */
/*******************/
@@ -157,6 +146,10 @@ H5_DLL herr_t H5Dread(hid_t dset_id, hid_t mem_type_id, hid_t mem_space_id,
hid_t file_space_id, hid_t plist_id, void *buf/*out*/);
H5_DLL herr_t H5Dwrite(hid_t dset_id, hid_t mem_type_id, hid_t mem_space_id,
hid_t file_space_id, hid_t plist_id, const void *buf);
+H5_DLL herr_t H5Dwrite_chunk(hid_t dset_id, hid_t dxpl_id, uint32_t filters,
+ const hsize_t *offset, size_t data_size, const void *buf);
+H5_DLL herr_t H5Dread_chunk(hid_t dset_id, hid_t dxpl_id,
+ const hsize_t *offset, uint32_t *filters, void *buf);
H5_DLL herr_t H5Diterate(void *buf, hid_t type_id, hid_t space_id,
H5D_operator_t op, void *operator_data);
H5_DLL herr_t H5Dvlen_reclaim(hid_t type_id, hid_t space_id, hid_t plist_id, void *buf);
@@ -185,7 +178,19 @@ H5_DLL herr_t H5Dget_chunk_index_type(hid_t did, H5D_chunk_index_t *idx_type);
/* Macros */
#define H5D_CHUNK_BTREE H5D_CHUNK_IDX_BTREE
-
+/* Formerly used to support the H5DOread/write_chunk() API calls.
+ * These symbols are no longer used in the library.
+ */
+/* Property names for H5DOwrite_chunk */
+#define H5D_XFER_DIRECT_CHUNK_WRITE_FLAG_NAME "direct_chunk_flag"
+#define H5D_XFER_DIRECT_CHUNK_WRITE_FILTERS_NAME "direct_chunk_filters"
+#define H5D_XFER_DIRECT_CHUNK_WRITE_OFFSET_NAME "direct_chunk_offset"
+#define H5D_XFER_DIRECT_CHUNK_WRITE_DATASIZE_NAME "direct_chunk_datasize"
+/* Property names for H5DOread_chunk */
+#define H5D_XFER_DIRECT_CHUNK_READ_FLAG_NAME "direct_chunk_read_flag"
+#define H5D_XFER_DIRECT_CHUNK_READ_OFFSET_NAME "direct_chunk_read_offset"
+#define H5D_XFER_DIRECT_CHUNK_READ_FILTERS_NAME "direct_chunk_read_filters"
+
/* Typedefs */
diff --git a/src/H5Pdxpl.c b/src/H5Pdxpl.c
index e33e762..b56c137 100644
--- a/src/H5Pdxpl.c
+++ b/src/H5Pdxpl.c
@@ -152,22 +152,6 @@
#define H5D_XFER_XFORM_COPY H5P__dxfr_xform_copy
#define H5D_XFER_XFORM_CMP H5P__dxfr_xform_cmp
#define H5D_XFER_XFORM_CLOSE H5P__dxfr_xform_close
-/* Definitions for properties of direct chunk write */
-#define H5D_XFER_DIRECT_CHUNK_WRITE_FLAG_SIZE sizeof(hbool_t)
-#define H5D_XFER_DIRECT_CHUNK_WRITE_FLAG_DEF FALSE
-#define H5D_XFER_DIRECT_CHUNK_WRITE_FILTERS_SIZE sizeof(uint32_t)
-#define H5D_XFER_DIRECT_CHUNK_WRITE_FILTERS_DEF 0
-#define H5D_XFER_DIRECT_CHUNK_WRITE_OFFSET_SIZE sizeof(hsize_t *)
-#define H5D_XFER_DIRECT_CHUNK_WRITE_OFFSET_DEF NULL
-#define H5D_XFER_DIRECT_CHUNK_WRITE_DATASIZE_SIZE sizeof(uint32_t)
-#define H5D_XFER_DIRECT_CHUNK_WRITE_DATASIZE_DEF 0
-/* Definitions for properties of direct chunk read */
-#define H5D_XFER_DIRECT_CHUNK_READ_FLAG_SIZE sizeof(hbool_t)
-#define H5D_XFER_DIRECT_CHUNK_READ_FLAG_DEF FALSE
-#define H5D_XFER_DIRECT_CHUNK_READ_FILTERS_SIZE sizeof(uint32_t)
-#define H5D_XFER_DIRECT_CHUNK_READ_FILTERS_DEF 0
-#define H5D_XFER_DIRECT_CHUNK_READ_OFFSET_SIZE sizeof(hsize_t *)
-#define H5D_XFER_DIRECT_CHUNK_READ_OFFSET_DEF NULL
/******************/
@@ -266,13 +250,6 @@ static const H5Z_EDC_t H5D_def_enable_edc_g = H5D_XFER_EDC_DEF; /* De
static const H5Z_cb_t H5D_def_filter_cb_g = H5D_XFER_FILTER_CB_DEF; /* Default value for filter callback */
static const H5T_conv_cb_t H5D_def_conv_cb_g = H5D_XFER_CONV_CB_DEF; /* Default value for datatype conversion callback */
static const void *H5D_def_xfer_xform_g = H5D_XFER_XFORM_DEF; /* Default value for data transform */
-static const hbool_t H5D_def_direct_chunk_flag_g = H5D_XFER_DIRECT_CHUNK_WRITE_FLAG_DEF; /* Default value for the flag of direct chunk write */
-static const uint32_t H5D_def_direct_chunk_filters_g = H5D_XFER_DIRECT_CHUNK_WRITE_FILTERS_DEF; /* Default value for the filters of direct chunk write */
-static const hsize_t *H5D_def_direct_chunk_offset_g = H5D_XFER_DIRECT_CHUNK_WRITE_OFFSET_DEF; /* Default value for the offset of direct chunk write */
-static const uint32_t H5D_def_direct_chunk_datasize_g = H5D_XFER_DIRECT_CHUNK_WRITE_DATASIZE_DEF; /* Default value for the datasize of direct chunk write */
-static const hbool_t direct_chunk_read_flag = H5D_XFER_DIRECT_CHUNK_READ_FLAG_DEF; /* Default value for the flag of direct chunk read */
-static const hsize_t *direct_chunk_read_offset = H5D_XFER_DIRECT_CHUNK_READ_OFFSET_DEF; /* Default value for the offset of direct chunk read */
-static const uint32_t direct_chunk_read_filters = H5D_XFER_DIRECT_CHUNK_READ_FILTERS_DEF; /* Default value for the filters of direct chunk read */
/*-------------------------------------------------------------------------
@@ -423,48 +400,6 @@ H5P__dxfr_reg_prop(H5P_genclass_t *pclass)
H5D_XFER_XFORM_DEL, H5D_XFER_XFORM_COPY, H5D_XFER_XFORM_CMP, H5D_XFER_XFORM_CLOSE) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
- /* Register the property of flag for direct chunk write */
- /* (Note: this property should not have an encode/decode callback -QAK) */
- if(H5P_register_real(pclass, H5D_XFER_DIRECT_CHUNK_WRITE_FLAG_NAME, H5D_XFER_DIRECT_CHUNK_WRITE_FLAG_SIZE, &H5D_def_direct_chunk_flag_g,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
- HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
-
- /* Register the property of filter for direct chunk write */
- /* (Note: this property should not have an encode/decode callback -QAK) */
- if(H5P_register_real(pclass, H5D_XFER_DIRECT_CHUNK_WRITE_FILTERS_NAME, H5D_XFER_DIRECT_CHUNK_WRITE_FILTERS_SIZE, &H5D_def_direct_chunk_filters_g,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
- HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
-
- /* Register the property of offset for direct chunk write */
- /* (Note: this property should not have an encode/decode callback -QAK) */
- if(H5P_register_real(pclass, H5D_XFER_DIRECT_CHUNK_WRITE_OFFSET_NAME, H5D_XFER_DIRECT_CHUNK_WRITE_OFFSET_SIZE, &H5D_def_direct_chunk_offset_g,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
- HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
-
- /* Register the property of datasize for direct chunk write */
- /* (Note: this property should not have an encode/decode callback -QAK) */
- if(H5P_register_real(pclass, H5D_XFER_DIRECT_CHUNK_WRITE_DATASIZE_NAME, H5D_XFER_DIRECT_CHUNK_WRITE_DATASIZE_SIZE, &H5D_def_direct_chunk_datasize_g,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
- HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
-
- /* Register the property of flag for direct chunk read */
- /* (Note: this property should not have an encode/decode callback) */
- if(H5P_register_real(pclass, H5D_XFER_DIRECT_CHUNK_READ_FLAG_NAME, H5D_XFER_DIRECT_CHUNK_READ_FLAG_SIZE, &direct_chunk_read_flag,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
- HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
-
- /* Register the property of filter for direct chunk read */
- /* (Note: this property should not have an encode/decode callback) */
- if(H5P_register_real(pclass, H5D_XFER_DIRECT_CHUNK_READ_FILTERS_NAME, H5D_XFER_DIRECT_CHUNK_READ_FILTERS_SIZE, &direct_chunk_read_filters,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
- HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
-
- /* Register the property of offset for direct chunk read */
- /* (Note: this property should not have an encode/decode callback) */
- if(H5P_register_real(pclass, H5D_XFER_DIRECT_CHUNK_READ_OFFSET_NAME, H5D_XFER_DIRECT_CHUNK_READ_OFFSET_SIZE, &direct_chunk_read_offset,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
- HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
-
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5P__dxfr_reg_prop() */
diff --git a/src/H5S.c b/src/H5S.c
index 3d09fa0..88c2f72 100644
--- a/src/H5S.c
+++ b/src/H5S.c
@@ -26,7 +26,6 @@
#include "H5Fprivate.h" /* Files */
#include "H5FLprivate.h" /* Free lists */
#include "H5Iprivate.h" /* IDs */
-#include "H5MMprivate.h" /* Memory management */
#include "H5Oprivate.h" /* Object headers */
#include "H5Spkg.h" /* Dataspaces */
@@ -208,6 +207,58 @@ H5S_term_package(void)
FUNC_LEAVE_NOAPI(n)
} /* end H5S_term_package() */
+
+
+/*--------------------------------------------------------------------------
+ NAME
+ H5S_get_validiated_dataspace
+ PURPOSE
+ Get a pointer to a validated H5S_t pointer
+ USAGE
+ H5S_t *H5S_get_validated_space(dataspace_id, space)
+ hid_t space_id; IN: The ID of the dataspace
+ const H5S_t * space; OUT: A pointer to the dataspace
+ RETURNS
+ SUCCEED/FAIL
+ DESCRIPTION
+ Gets a pointer to a dataspace struct after validating it. The pointer
+ can be NULL (if the ID is H5S_ALL, for example).
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5S_get_validated_dataspace(hid_t space_id, const H5S_t **space)
+{
+ herr_t ret_value = SUCCEED; /* Return value */
+
+ FUNC_ENTER_NOAPI(FAIL)
+
+ HDassert(space);
+
+ if (space_id < 0)
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid space_id (ID cannot be a negative number)")
+
+ if (H5S_ALL == space_id) {
+ /* No special dataspace struct for H5S_ALL */
+ *space = NULL;
+ }
+ else {
+ /* Get the dataspace pointer */
+ if (NULL == (*space = (const H5S_t *)H5I_object_verify(space_id, H5I_DATASPACE)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "space_id is not a dataspace ID")
+
+ /* Check for valid selection */
+ if (H5S_SELECT_VALID(*space) != TRUE)
+ HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, FAIL, "selection + offset not within extent")
+ }
+
+done:
+ FUNC_LEAVE_NOAPI(ret_value)
+
+} /* end H5S_get_validated_dataspace() */
+
/*--------------------------------------------------------------------------
NAME
diff --git a/src/H5Sprivate.h b/src/H5Sprivate.h
index b4ae1ff..15ce75d 100644
--- a/src/H5Sprivate.h
+++ b/src/H5Sprivate.h
@@ -215,6 +215,7 @@ H5_DLL herr_t H5S_set_extent_real(H5S_t *space, const hsize_t *size);
H5_DLL herr_t H5S_set_extent_simple(H5S_t *space, unsigned rank,
const hsize_t *dims, const hsize_t *max);
H5_DLL H5S_t *H5S_create(H5S_class_t type);
+H5_DLL herr_t H5S_get_validated_dataspace(hid_t space_id, const H5S_t **space/*out*/);
H5_DLL H5S_t *H5S_create_simple(unsigned rank, const hsize_t dims[/*rank*/],
const hsize_t maxdims[/*rank*/]);
H5_DLL herr_t H5S_set_version(H5F_t *f, H5S_t *ds);
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index 1ab7b5a..a2ade92 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -200,6 +200,7 @@ set (H5_TESTS
cmpd_dset
filter_fail
extend
+ direct_chunk
external
efc
objcopy
diff --git a/test/CMakeTests.cmake b/test/CMakeTests.cmake
index 2de0f0d..39d9d0d 100644
--- a/test/CMakeTests.cmake
+++ b/test/CMakeTests.cmake
@@ -532,6 +532,7 @@ set (test_CLEANFILES
vds_swmr.h5
vds_swmr_src_*.h5
tmp/vds_src_2.h5
+ direct_chunk.h5
)
# Remove any output file left over from previous test run
diff --git a/test/Makefile.am b/test/Makefile.am
index bb80fed..dcc002c 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -55,11 +55,12 @@ TEST_PROG= testhdf5 \
cache cache_api cache_image cache_tagging lheap ohdr stab gheap \
evict_on_close farray earray btree2 fheap \
pool accum hyperslab istore bittests dt_arith page_buffer \
- dtypes dsets cmpd_dset filter_fail extend external efc objcopy links unlink \
- twriteorder big mtime fillval mount flush1 flush2 app_ref enum \
- set_extent ttsafe enc_dec_plist enc_dec_plist_cross_platform\
- getname vfd ntypes dangle dtransform reserved cross_read \
- freespace mf vds file_image unregister cache_logging cork swmr
+ dtypes dsets cmpd_dset filter_fail extend direct_chunk external efc \
+ objcopy links unlink twriteorder big mtime fillval mount \
+ flush1 flush2 app_ref enum set_extent ttsafe enc_dec_plist \
+ enc_dec_plist_cross_platform getname vfd ntypes dangle dtransform \
+ reserved cross_read freespace mf vds file_image unregister \
+ cache_logging cork swmr
# List programs to be built when testing here.
# error_test and err_compat are built at the same time as the other tests, but executed by testerror.sh.
@@ -190,7 +191,7 @@ CHECK_CLEANFILES+=accum.h5 cmpd_dset.h5 compact_dataset.h5 dataset.h5 dset_offse
flushrefresh_VERIFICATION_DONE atomic_data accum_swmr_big.h5 ohdr_swmr.h5 \
test_swmr*.h5 cache_logging.h5 cache_logging.out vds_swmr.h5 vds_swmr_src_*.h5 \
swmr[0-2].h5 swmr_writer.out swmr_writer.log.* swmr_reader.out.* swmr_reader.log.* \
- tbogus.h5.copy cache_image_test.h5
+ tbogus.h5.copy cache_image_test.h5 direct_chunk.h5
# Sources for testhdf5 executable
testhdf5_SOURCES=testhdf5.c tarray.c tattr.c tchecksum.c tconfig.c tfile.c \
diff --git a/hl/test/test_dset_opt.c b/test/direct_chunk.c
index ef4cf13..2ef38ea 100644
--- a/hl/test/test_dset_opt.c
+++ b/test/direct_chunk.c
@@ -11,11 +11,7 @@
* help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-#include <stdlib.h>
-#include <string.h>
-#include "h5hltest.h"
-#include "H5DOpublic.h"
-#include <math.h>
+#include "h5test.h"
#if defined(H5_HAVE_ZLIB_H) && !defined(H5_ZLIB_HEADER)
# define H5_ZLIB_HEADER "zlib.h"
@@ -24,7 +20,7 @@
# include H5_ZLIB_HEADER /* "zlib.h" */
#endif
-#define FILE_NAME "test_dectris.h5"
+#define FILE_NAME "direct_chunk.h5"
/* Datasets for Direct Write tests */
#define DATASETNAME1 "direct_write"
@@ -100,7 +96,7 @@ const H5Z_class2_t H5Z_BOGUS2[1] = {{
/*-------------------------------------------------------------------------
* Function: test_direct_chunk_write
*
- * Purpose: Test the basic functionality of H5DOwrite_chunk
+ * Purpose: Test the basic functionality of H5Dwrite_chunk
*
* Return: Success: 0
* Failure: 1
@@ -143,7 +139,7 @@ test_direct_chunk_write (hid_t file)
hsize_t count[2]; /* Block count */
hsize_t block[2]; /* Block sizes */
- TESTING("basic functionality of H5DOwrite_chunk");
+ TESTING("basic functionality of H5Dwrite_chunk");
/*
* Create the data space with unlimited dimensions.
@@ -184,7 +180,7 @@ test_direct_chunk_write (hid_t file)
/*
* Write the data for the dataset. It should stay in the chunk cache.
- * It will be evicted from the cache by the H5DOwrite_chunk calls.
+ * It will be evicted from the cache by the H5Dwrite_chunk calls.
*/
if((status = H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL,
dxpl, data)) < 0)
@@ -218,7 +214,7 @@ test_direct_chunk_write (hid_t file)
* dataset, using the direct writing function. */
for(i=0; i<NX/CHUNK_NX; i++) {
for(j=0; j<NY/CHUNK_NY; j++) {
- status = H5DOwrite_chunk(dataset, dxpl, filter_mask, offset, z_dst_nbytes, outbuf);
+ status = H5Dwrite_chunk(dataset, dxpl, filter_mask, offset, z_dst_nbytes, outbuf);
offset[1] += CHUNK_NY;
}
offset[0] += CHUNK_NX;
@@ -292,7 +288,7 @@ test_direct_chunk_write (hid_t file)
offset[0] = offset[1] = 0;
for(i=0; i<NX/CHUNK_NX; i++) {
for(j=0; j<NY/CHUNK_NY; j++) {
- status = H5DOwrite_chunk(dataset, dxpl, filter_mask, offset, z_dst_nbytes, outbuf);
+ status = H5Dwrite_chunk(dataset, dxpl, filter_mask, offset, z_dst_nbytes, outbuf);
offset[1] += CHUNK_NY;
}
offset[0] += CHUNK_NX;
@@ -389,7 +385,7 @@ test_direct_chunk_overwrite_data(hid_t fid)
int16_t n;
int16_t read_buf[OVERWRITE_CHUNK_NY][OVERWRITE_CHUNK_2NX];
- TESTING("overwriting existing data with H5DOwrite_chunk");
+ TESTING("overwriting existing data with H5Dwrite_chunk");
/* Create the dataset's data space */
if ((sid = H5Screate_simple(OVERWRITE_NDIMS, dset_dims, dset_max_dims)) < 0)
@@ -417,17 +413,17 @@ test_direct_chunk_overwrite_data(hid_t fid)
}
/* Write chunk data using the direct write function. */
- if (H5DOwrite_chunk(did, H5P_DEFAULT, filter_mask, offset, buf_size, data_buf) < 0)
+ if (H5Dwrite_chunk(did, H5P_DEFAULT, filter_mask, offset, buf_size, data_buf) < 0)
FAIL_STACK_ERROR
/* Write second chunk. */
offset[2] = OVERWRITE_CHUNK_NX;
- if (H5DOwrite_chunk(did, H5P_DEFAULT, filter_mask, offset, buf_size, data_buf) < 0)
+ if (H5Dwrite_chunk(did, H5P_DEFAULT, filter_mask, offset, buf_size, data_buf) < 0)
FAIL_STACK_ERROR
/* Overwrite first chunk. */
offset[2] = 0;
- if (H5DOwrite_chunk(did, H5P_DEFAULT, filter_mask, offset, buf_size, overwrite_buf) < 0)
+ if (H5Dwrite_chunk(did, H5P_DEFAULT, filter_mask, offset, buf_size, overwrite_buf) < 0)
FAIL_STACK_ERROR
/* Read the data back out */
@@ -504,7 +500,7 @@ test_skip_compress_write1(hid_t file)
hsize_t count[2]; /* Block count */
hsize_t block[2]; /* Block sizes */
- TESTING("skipping compression filter for H5DOwrite_chunk/H5DOread_chunk");
+ TESTING("skipping compression filter for H5Dwrite_chunk/H5Dread_chunk");
/*
* Create the data space with unlimited dimensions.
@@ -551,7 +547,7 @@ test_skip_compress_write1(hid_t file)
filter_mask = 0x00000001;
- if((status = H5DOwrite_chunk(dataset, dxpl, filter_mask, offset, buf_size, direct_buf)) < 0)
+ if((status = H5Dwrite_chunk(dataset, dxpl, filter_mask, offset, buf_size, direct_buf)) < 0)
goto error;
if(H5Fflush(dataset, H5F_SCOPE_LOCAL) < 0)
@@ -597,7 +593,7 @@ test_skip_compress_write1(hid_t file)
/* Read the raw chunk back */
HDmemset(&read_direct_buf, 0, sizeof(read_direct_buf));
- if((status = H5DOread_chunk(dataset, H5P_DEFAULT, offset, &read_filter_mask, read_direct_buf)) < 0)
+ if((status = H5Dread_chunk(dataset, H5P_DEFAULT, offset, &read_filter_mask, read_direct_buf)) < 0)
goto error;
if(read_filter_mask != filter_mask)
goto error;
@@ -822,7 +818,7 @@ test_skip_compress_write2(hid_t file)
/* compression filter is the middle one to be skipped */
filter_mask = 0x00000002;
- if((status = H5DOwrite_chunk(dataset, dxpl, filter_mask, offset, buf_size, direct_buf)) < 0)
+ if((status = H5Dwrite_chunk(dataset, dxpl, filter_mask, offset, buf_size, direct_buf)) < 0)
goto error;
if(H5Fflush(dataset, H5F_SCOPE_LOCAL) < 0)
@@ -868,7 +864,7 @@ test_skip_compress_write2(hid_t file)
/* Read the raw chunk back */
HDmemset(&read_direct_buf, 0, sizeof(read_direct_buf));
- if((status = H5DOread_chunk(dataset, H5P_DEFAULT, offset, &read_filter_mask, read_direct_buf)) < 0)
+ if((status = H5Dread_chunk(dataset, H5P_DEFAULT, offset, &read_filter_mask, read_direct_buf)) < 0)
goto error;
if(read_filter_mask != filter_mask)
goto error;
@@ -948,7 +944,7 @@ test_data_conv(hid_t file)
unsigned filter_mask = 0;
src_type_t direct_buf[CHUNK_NX][CHUNK_NY];
dst_type_t check_chunk[CHUNK_NX][CHUNK_NY];
- src_type_t read_chunk[CHUNK_NX][CHUNK_NY]; /* For H5DOread_chunk */
+ src_type_t read_chunk[CHUNK_NX][CHUNK_NY]; /* For H5Dread_chunk */
hsize_t offset[2] = {0, 0};
size_t buf_size = CHUNK_NX*CHUNK_NY*sizeof(src_type_t);
@@ -958,7 +954,7 @@ test_data_conv(hid_t file)
hsize_t count[2]; /* Block count */
hsize_t block[2]; /* Block sizes */
- TESTING("data conversion for H5DOwrite_chunk/H5DOread_chunk");
+ TESTING("data conversion for H5Dwrite_chunk/H5Dread_chunk");
/*
* Create the data space with unlimited dimensions.
@@ -1031,7 +1027,7 @@ test_data_conv(hid_t file)
offset[0] = CHUNK_NX;
offset[1] = CHUNK_NY;
- if((status = H5DOwrite_chunk(dataset, dxpl, filter_mask, offset, buf_size, direct_buf)) < 0)
+ if((status = H5Dwrite_chunk(dataset, dxpl, filter_mask, offset, buf_size, direct_buf)) < 0)
goto error;
if(H5Fflush(dataset, H5F_SCOPE_LOCAL) < 0)
@@ -1043,8 +1039,8 @@ test_data_conv(hid_t file)
if((dataset = H5Dopen2(file, DATASETNAME4, H5P_DEFAULT)) < 0)
goto error;
- /* Use H5DOread_chunk() to read the uncompressed data */
- if((status = H5DOread_chunk(dataset, dxpl, offset, &filter_mask, read_chunk)) < 0)
+ /* Use H5Dread_chunk() to read the uncompressed data */
+ if((status = H5Dread_chunk(dataset, dxpl, offset, &filter_mask, read_chunk)) < 0)
goto error;
/* Check that the values read are the same as the values written */
@@ -1141,7 +1137,7 @@ error:
/*-------------------------------------------------------------------------
* Function: test_invalid_parameters
*
- * Purpose: Test invalid parameters for H5DOwrite_chunk and H5DOread_chunk
+ * Purpose: Test invalid parameters for H5Dwrite_chunk and H5Dread_chunk
*
* Return: Success: 0
* Failure: 1
@@ -1170,7 +1166,7 @@ test_invalid_parameters(hid_t file)
hsize_t chunk_nbytes; /* Chunk size */
- TESTING("invalid parameters for H5DOwrite_chunk/H5DOread_chunk");
+ TESTING("invalid parameters for H5Dwrite_chunk/H5Dread_chunk");
/*
* Create the data space with unlimited dimensions.
@@ -1188,7 +1184,7 @@ test_invalid_parameters(hid_t file)
goto error;
/*
- * Create a new contiguous dataset to verify H5DOwrite_chunk/H5DOread_chunk doesn't work
+ * Create a new contiguous dataset to verify H5Dwrite_chunk/H5Dread_chunk doesn't work
*/
if((dataset = H5Dcreate2(file, DATASETNAME5, H5T_NATIVE_INT, dataspace, H5P_DEFAULT,
cparms, H5P_DEFAULT)) < 0)
@@ -1208,7 +1204,7 @@ test_invalid_parameters(hid_t file)
offset[1] = CHUNK_NY;
H5E_BEGIN_TRY {
- if((status = H5DOwrite_chunk(dataset, dxpl, filter_mask, offset, buf_size, direct_buf)) != FAIL)
+ if((status = H5Dwrite_chunk(dataset, dxpl, filter_mask, offset, buf_size, direct_buf)) != FAIL)
goto error;
} H5E_END_TRY;
@@ -1218,9 +1214,9 @@ test_invalid_parameters(hid_t file)
goto error;
} H5E_END_TRY;
- /* Try to H5DOread_chunk from the contiguous dataset. It should fail */
+ /* Try to H5Dread_chunk from the contiguous dataset. It should fail */
H5E_BEGIN_TRY {
- if((status = H5DOread_chunk(dataset, dxpl, offset, &filter_mask, direct_buf)) != FAIL)
+ if((status = H5Dread_chunk(dataset, dxpl, offset, &filter_mask, direct_buf)) != FAIL)
goto error;
} H5E_END_TRY;
@@ -1243,83 +1239,83 @@ test_invalid_parameters(hid_t file)
cparms, H5P_DEFAULT)) < 0)
goto error;
- /* Check invalid dataset ID for H5DOwrite_chunk and H5DOread_chunk */
+ /* Check invalid dataset ID for H5Dwrite_chunk and H5Dread_chunk */
H5E_BEGIN_TRY {
- if((status = H5DOwrite_chunk((hid_t)-1, dxpl, filter_mask, offset, buf_size, direct_buf)) != FAIL)
+ if((status = H5Dwrite_chunk((hid_t)-1, dxpl, filter_mask, offset, buf_size, direct_buf)) != FAIL)
goto error;
} H5E_END_TRY;
H5E_BEGIN_TRY {
- if((status = H5DOread_chunk((hid_t)-1, dxpl, offset, &filter_mask, direct_buf)) != FAIL)
+ if((status = H5Dread_chunk((hid_t)-1, dxpl, offset, &filter_mask, direct_buf)) != FAIL)
goto error;
} H5E_END_TRY;
- /* Check invalid DXPL ID for H5DOwrite_chunk and H5DOread_chunk */
+ /* Check invalid DXPL ID for H5Dwrite_chunk and H5Dread_chunk */
H5E_BEGIN_TRY {
- if((status = H5DOwrite_chunk(dataset, (hid_t)-1, filter_mask, offset, buf_size, direct_buf)) != FAIL)
+ if((status = H5Dwrite_chunk(dataset, (hid_t)-1, filter_mask, offset, buf_size, direct_buf)) != FAIL)
goto error;
} H5E_END_TRY;
H5E_BEGIN_TRY {
- if((status = H5DOread_chunk(dataset, (hid_t)-1, offset, &filter_mask, direct_buf)) != FAIL)
+ if((status = H5Dread_chunk(dataset, (hid_t)-1, offset, &filter_mask, direct_buf)) != FAIL)
goto error;
} H5E_END_TRY;
- /* Check invalid OFFSET for H5DOwrite_chunk and H5DOread_chunk */
+ /* Check invalid OFFSET for H5Dwrite_chunk and H5Dread_chunk */
H5E_BEGIN_TRY {
- if((status = H5DOwrite_chunk(dataset, dxpl, filter_mask, NULL, buf_size, direct_buf)) != FAIL)
+ if((status = H5Dwrite_chunk(dataset, dxpl, filter_mask, NULL, buf_size, direct_buf)) != FAIL)
goto error;
} H5E_END_TRY;
H5E_BEGIN_TRY {
- if((status = H5DOread_chunk(dataset, dxpl, NULL, &filter_mask, direct_buf)) != FAIL)
+ if((status = H5Dread_chunk(dataset, dxpl, NULL, &filter_mask, direct_buf)) != FAIL)
goto error;
} H5E_END_TRY;
- /* Check when OFFSET is out of dataset range for H5DOwrite_chunk and H5DOread_chunk */
+ /* Check when OFFSET is out of dataset range for H5Dwrite_chunk and H5Dread_chunk */
offset[0] = NX + 1;
offset[1] = NY;
H5E_BEGIN_TRY {
- if((status = H5DOwrite_chunk(dataset, dxpl, filter_mask, offset, buf_size, direct_buf)) != FAIL)
+ if((status = H5Dwrite_chunk(dataset, dxpl, filter_mask, offset, buf_size, direct_buf)) != FAIL)
goto error;
} H5E_END_TRY;
H5E_BEGIN_TRY {
- if((status = H5DOread_chunk(dataset, dxpl, offset, &filter_mask, direct_buf)) != FAIL)
+ if((status = H5Dread_chunk(dataset, dxpl, offset, &filter_mask, direct_buf)) != FAIL)
goto error;
} H5E_END_TRY;
- /* Check when OFFSET is not on chunk boundary for H5DOwrite_chunk and H5DOread_chunk */
+ /* Check when OFFSET is not on chunk boundary for H5Dwrite_chunk and H5Dread_chunk */
offset[0] = CHUNK_NX;
offset[1] = CHUNK_NY + 1;
H5E_BEGIN_TRY {
- if((status = H5DOwrite_chunk(dataset, dxpl, filter_mask, offset, buf_size, direct_buf)) != FAIL)
+ if((status = H5Dwrite_chunk(dataset, dxpl, filter_mask, offset, buf_size, direct_buf)) != FAIL)
goto error;
} H5E_END_TRY;
H5E_BEGIN_TRY {
- if((status = H5DOread_chunk(dataset, dxpl, offset, &filter_mask, direct_buf)) != FAIL)
+ if((status = H5Dread_chunk(dataset, dxpl, offset, &filter_mask, direct_buf)) != FAIL)
goto error;
} H5E_END_TRY;
- /* Check invalid buffer size for H5DOwrite_chunk only */
+ /* Check invalid buffer size for H5Dwrite_chunk only */
offset[0] = CHUNK_NX;
offset[1] = CHUNK_NY;
buf_size = 0;
H5E_BEGIN_TRY {
- if((status = H5DOwrite_chunk(dataset, dxpl, filter_mask, offset, buf_size, direct_buf)) != FAIL)
+ if((status = H5Dwrite_chunk(dataset, dxpl, filter_mask, offset, buf_size, direct_buf)) != FAIL)
goto error;
} H5E_END_TRY;
- /* Check invalid data buffer for H5DOwrite_chunk and H5DOread_chunk */
+ /* Check invalid data buffer for H5Dwrite_chunk and H5Dread_chunk */
buf_size = CHUNK_NX*CHUNK_NY*sizeof(int);
H5E_BEGIN_TRY {
- if((status = H5DOwrite_chunk(dataset, dxpl, filter_mask, offset, buf_size, NULL)) != FAIL)
+ if((status = H5Dwrite_chunk(dataset, dxpl, filter_mask, offset, buf_size, NULL)) != FAIL)
goto error;
} H5E_END_TRY;
H5E_BEGIN_TRY {
- if((status = H5DOread_chunk(dataset, dxpl, offset, &filter_mask, NULL)) != FAIL)
+ if((status = H5Dread_chunk(dataset, dxpl, offset, &filter_mask, NULL)) != FAIL)
goto error;
} H5E_END_TRY;
@@ -1353,7 +1349,7 @@ error:
/*-------------------------------------------------------------------------
* Function: test_direct_chunk_read_no_cache
*
- * Purpose: Test the basic functionality of H5DOread_chunk with the
+ * Purpose: Test the basic functionality of H5Dread_chunk with the
* chunk cache diabled.
*
* Return: Success: 0
@@ -1379,10 +1375,10 @@ test_direct_chunk_read_no_cache (hid_t file)
int data[NX][NY];
int i, j, k, l, n; /* local index variables */
- unsigned filter_mask = 0; /* filter mask returned from H5DOread_chunk */
- int direct_buf[CHUNK_NX][CHUNK_NY]; /* chunk read with H5DOread and manually decompressed */
+ unsigned filter_mask = 0; /* filter mask returned from H5Dread_chunk */
+ int direct_buf[CHUNK_NX][CHUNK_NY]; /* chunk read with H5Dread and manually decompressed */
int check_chunk[CHUNK_NX][CHUNK_NY]; /* chunk read with H5Dread */
- hsize_t offset[2]; /* chunk offset used for H5DOread_chunk */
+ hsize_t offset[2]; /* chunk offset used for H5Dread_chunk */
size_t buf_size = CHUNK_NX*CHUNK_NY*sizeof(int);
Bytef *z_src = NULL; /* source buffer */
@@ -1397,7 +1393,7 @@ test_direct_chunk_read_no_cache (hid_t file)
hsize_t count[2]; /* Block count */
hsize_t block[2]; /* Block sizes */
- TESTING("basic functionality of H5DOread_chunk (chunk cache disabled)");
+ TESTING("basic functionality of H5Dread_chunk (chunk cache disabled)");
/* Create the data space with unlimited dimensions. */
if((dataspace = H5Screate_simple(RANK, dims, maxdims)) < 0)
@@ -1442,7 +1438,7 @@ test_direct_chunk_read_no_cache (hid_t file)
outbuf = HDmalloc(z_src_nbytes);
z_src = (Bytef *)outbuf;
- /* For each chunk in the dataset, compare the result of H5Dread and H5DOread_chunk. */
+ /* For each chunk in the dataset, compare the result of H5Dread and H5Dread_chunk. */
for(i=0; i<NX/CHUNK_NX; i++) {
for(j=0; j<NY/CHUNK_NY; j++) {
/* Select hyperslab for one chunk in the file */
@@ -1461,7 +1457,7 @@ test_direct_chunk_read_no_cache (hid_t file)
offset[0] = (hsize_t)i * CHUNK_NX; offset[1] = (hsize_t)j * CHUNK_NY;
/* Read the compressed chunk back using the direct read function. */
- if((status = H5DOread_chunk(dataset, dxpl, offset, &filter_mask, outbuf)) < 0)
+ if((status = H5Dread_chunk(dataset, dxpl, offset, &filter_mask, outbuf)) < 0)
goto error;
/* Check filter mask return value */
@@ -1547,10 +1543,10 @@ test_direct_chunk_read_cache (hid_t file, hbool_t flush)
int data[NX][NY];
int i, j, k, l, n; /* local index variables */
- unsigned filter_mask = 0; /* filter mask returned from H5DOread_chunk */
- int direct_buf[CHUNK_NX][CHUNK_NY]; /* chunk read with H5DOread and manually decompressed */
+ unsigned filter_mask = 0; /* filter mask returned from H5Dread_chunk */
+ int direct_buf[CHUNK_NX][CHUNK_NY]; /* chunk read with H5Dread and manually decompressed */
int check_chunk[CHUNK_NX][CHUNK_NY]; /* chunk read with H5Dread */
- hsize_t offset[2]; /* chunk offset used for H5DOread_chunk */
+ hsize_t offset[2]; /* chunk offset used for H5Dread_chunk */
size_t buf_size = CHUNK_NX*CHUNK_NY*sizeof(int);
Bytef *z_src = NULL; /* source buffer */
@@ -1567,9 +1563,9 @@ test_direct_chunk_read_cache (hid_t file, hbool_t flush)
hsize_t block[2]; /* Block sizes */
if(flush) {
- TESTING("basic functionality of H5DOread_chunk (flush chunk cache)");
+ TESTING("basic functionality of H5Dread_chunk (flush chunk cache)");
} else {
- TESTING("basic functionality of H5DOread_chunk (does not flush chunk cache)");
+ TESTING("basic functionality of H5Dread_chunk (does not flush chunk cache)");
}
/* Create the data space with unlimited dimensions. */
@@ -1615,7 +1611,7 @@ test_direct_chunk_read_cache (hid_t file, hbool_t flush)
outbuf = HDmalloc(z_src_nbytes);
z_src = (Bytef *)outbuf;
- /* For each chunk in the dataset, compare the result of H5Dread and H5DOread_chunk. */
+ /* For each chunk in the dataset, compare the result of H5Dread and H5Dread_chunk. */
for(i=0; i<NX/CHUNK_NX; i++) {
for(j=0; j<NY/CHUNK_NY; j++) {
/* Select hyperslab for one chunk in the file */
@@ -1641,7 +1637,7 @@ test_direct_chunk_read_cache (hid_t file, hbool_t flush)
goto error;
/* Read the compressed chunk back using the direct read function. */
- if((status = H5DOread_chunk(dataset, dxpl, offset, &filter_mask, outbuf)) < 0)
+ if((status = H5Dread_chunk(dataset, dxpl, offset, &filter_mask, outbuf)) < 0)
goto error;
/* Check filter mask return value */
@@ -1713,7 +1709,7 @@ error:
/*-------------------------------------------------------------------------
* Function: test_read_unfiltered_dset
*
- * Purpose: Test the basic functionality of H5DOread_chunk on a dataset
+ * Purpose: Test the basic functionality of H5Dread_chunk on a dataset
* without no filters applied.
*
* Return: Success: 0
@@ -1749,7 +1745,7 @@ test_read_unfiltered_dset(hid_t file)
hsize_t count[2]; /* Block count */
hsize_t block[2]; /* Block sizes */
- TESTING("basic functionality of H5DOread_chunk on unfiltered datasets");
+ TESTING("basic functionality of H5Dread_chunk on unfiltered datasets");
/* Create the data space with unlimited dimensions. */
if((dataspace = H5Screate_simple(RANK, dims, maxdims)) < 0)
@@ -1778,7 +1774,7 @@ test_read_unfiltered_dset(hid_t file)
/* Write the data for the dataset.
* It should stay in the chunk cache and will be evicted/flushed by
- * the H5DOread_chunk function call. */
+ * the H5Dread_chunk function call. */
if((status = H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL,
dxpl, data)) < 0)
goto error;
@@ -1786,7 +1782,7 @@ test_read_unfiltered_dset(hid_t file)
if(H5Fflush(dataset, H5F_SCOPE_LOCAL) < 0)
goto error;
- /* For each chunk in the dataset, compare the result of H5Dread and H5DOread_chunk. */
+ /* For each chunk in the dataset, compare the result of H5Dread and H5Dread_chunk. */
for(i=0; i<NX/CHUNK_NX; i++) {
for(j=0; j<NY/CHUNK_NY; j++) {
/* Select hyperslab for one chunk in the file */
@@ -1814,7 +1810,7 @@ test_read_unfiltered_dset(hid_t file)
/* Read the raw chunk back */
HDmemset(&direct_buf, 0, sizeof(direct_buf));
filter_mask = UINT_MAX;
- if((status = H5DOread_chunk(dataset, dxpl, offset, &filter_mask, direct_buf)) < 0)
+ if((status = H5Dread_chunk(dataset, dxpl, offset, &filter_mask, direct_buf)) < 0)
goto error;
/* Check filter mask return value */
@@ -1861,7 +1857,7 @@ error:
/*-------------------------------------------------------------------------
* Function: test_read_unallocated_chunk
*
- * Purpose: Tests the H5DOread_chunk and H5Dget_chunk_storage_size with valid
+ * Purpose: Tests the H5Dread_chunk and H5Dget_chunk_storage_size with valid
* offets to chunks that have not been written to the dataset and are
* not allocated in the chunk storage on disk.
*
@@ -1887,11 +1883,11 @@ test_read_unallocated_chunk (hid_t file)
herr_t status; /* status from H5 function calls */
hsize_t i, j; /* local index variables */
- unsigned filter_mask = 0; /* filter mask returned from H5DOread_chunk */
- int direct_buf[CHUNK_NX][CHUNK_NY]; /* chunk read with H5DOread and manually decompressed */
- hsize_t offset[2]; /* chunk offset used for H5DOread_chunk */
+ unsigned filter_mask = 0; /* filter mask returned from H5Dread_chunk */
+ int direct_buf[CHUNK_NX][CHUNK_NY]; /* chunk read with H5Dread and manually decompressed */
+ hsize_t offset[2]; /* chunk offset used for H5Dread_chunk */
- TESTING("H5DOread_chunk with unallocated chunks");
+ TESTING("H5Dread_chunk with unallocated chunks");
/* Create the data space with unlimited dimensions. */
if((dataspace = H5Screate_simple(RANK, dims, maxdims)) < 0)
@@ -1917,11 +1913,11 @@ test_read_unallocated_chunk (hid_t file)
HDmemset(&chunk_dims, 0, sizeof(chunk_dims));
offset[0] = 0; offset[1] = 0;
- if(H5DOwrite_chunk(dataset, dxpl, filter_mask, offset, chunk_nbytes, &chunk_dims) < 0)
+ if(H5Dwrite_chunk(dataset, dxpl, filter_mask, offset, chunk_nbytes, &chunk_dims) < 0)
goto error;
/* Attempt to read each chunk in the dataset. Chunks are not allocated,
- * therefore we expect the result of H5DOread_chunk to fail. Chunk idx starts
+ * therefore we expect the result of H5Dread_chunk to fail. Chunk idx starts
* at 1, since one chunk was written to init the chunk storage. */
for(i=1; i<NX/CHUNK_NX; i++) {
for(j=0; j<NY/CHUNK_NY; j++) {
@@ -1931,7 +1927,7 @@ test_read_unallocated_chunk (hid_t file)
/* Read a non-existant chunk using the direct read function. */
H5E_BEGIN_TRY {
- status = H5DOread_chunk(dataset, dxpl, offset, &filter_mask, &direct_buf);
+ status = H5Dread_chunk(dataset, dxpl, offset, &filter_mask, &direct_buf);
} H5E_END_TRY;
/* Check that the chunk read call does not succeed. */
@@ -2013,7 +2009,7 @@ test_single_chunk_latest(void)
int rdata[DIM0][DIM1]; /* Read buffer */
int i, j; /* Local index variable */
- TESTING("H5DOwrite_chunk with single chunk and latest format");
+ TESTING("H5Dwrite_chunk with single chunk and latest format");
/* Initialize data */
for (i=0; i<DIM0; i++) {
@@ -2044,7 +2040,7 @@ test_single_chunk_latest(void)
goto error;
/* Write the data directly to the dataset */
- if(H5DOwrite_chunk(did, H5P_DEFAULT, 0, offset, CHUNK0*CHUNK1*4, (void *)wdata) < 0)
+ if(H5Dwrite_chunk(did, H5P_DEFAULT, 0, offset, CHUNK0*CHUNK1*4, (void *)wdata) < 0)
goto error;
/*
@@ -2112,8 +2108,8 @@ error:
/*-------------------------------------------------------------------------
* Function: Main function
*
- * Purpose: Test direct chunk write function H5DOwrite_chunk and
- * chunk direct read function H5DOread_chunk
+ * Purpose: Test direct chunk write function H5Dwrite_chunk and
+ * chunk direct read function H5Dread_chunk
*
* Return: Success: 0
* Failure: 1
diff --git a/test/testfiles/err_compat_1 b/test/testfiles/err_compat_1
index d471e13..8190665 100644
--- a/test/testfiles/err_compat_1
+++ b/test/testfiles/err_compat_1
@@ -54,6 +54,6 @@ HDF5-DIAG: Error detected in HDF5 (version (number)) thread (IDs):
#001: (file name) line (number) in test_error2(): H5Dwrite shouldn't succeed
major: Error API
minor: Write failed
- #002: (file name) line (number) in H5Dwrite(): not a dataset
+ #002: (file name) line (number) in H5Dwrite(): dset_id is not a dataset ID
major: Invalid arguments to routine
minor: Inappropriate type
diff --git a/test/testfiles/error_test_1 b/test/testfiles/error_test_1
index b0b5085..02cfed8 100644
--- a/test/testfiles/error_test_1
+++ b/test/testfiles/error_test_1
@@ -21,7 +21,7 @@ Error Test-DIAG: Error detected in Error Program (1.0) thread (IDs):
Testing error API based on data I/O
HDF5-DIAG: Error detected in HDF5 (version (number)) thread (IDs):
- #000: (file name) line (number) in H5Dwrite(): not a dataset
+ #000: (file name) line (number) in H5Dwrite(): dset_id is not a dataset ID
major: Invalid arguments to routine
minor: Inappropriate type
Error Test-DIAG: Error detected in Error Program (1.0) thread (IDs):
@@ -32,7 +32,7 @@ Error Test-DIAG: Error detected in Error Program (1.0) thread (IDs):
major: Error in IO
minor: Error in H5Dwrite
HDF5-DIAG: Error detected in HDF5 (version (number)) thread (IDs):
- #002: (file name) line (number) in H5Dwrite(): not a dataset
+ #002: (file name) line (number) in H5Dwrite(): dset_id is not a dataset ID
major: Invalid arguments to routine
minor: Inappropriate type
diff --git a/hl/test/dectris_hl_perf.c b/tools/test/perform/direct_write_perf.c
index 13cfac8..f13cd24 100644
--- a/hl/test/dectris_hl_perf.c
+++ b/tools/test/perform/direct_write_perf.c
@@ -12,11 +12,11 @@
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
- * This test is for the DECTRIS project to the H5DOwrite_chunk function
+ * This tests the performance of the H5Dwrite_chunk() function.
*
*/
-#include "hdf5_hl.h"
+#include "hdf5.h"
#ifdef H5_HAVE_FILTER_DEFLATE
#include <zlib.h>
@@ -51,7 +51,7 @@
#endif
const char *FILENAME[] = {
- "dectris_perf",
+ "direct_write",
"unix.raw",
NULL
};
@@ -285,7 +285,7 @@ test_direct_write_uncompressed_data(hid_t fapl_id)
struct timeval timeval_start;
- TESTING("H5DOwrite_chunk for uncompressed data");
+ TESTING("H5Dwrite_chunk for uncompressed data");
if((dxpl = H5Pcreate(H5P_DATASET_XFER)) < 0)
TEST_ERROR;
@@ -304,7 +304,7 @@ test_direct_write_uncompressed_data(hid_t fapl_id)
/* Write the compressed chunk data repeatedly to cover all the chunks in the
* dataset, using the direct writing function. */
for(i=0; i<NX; i++) {
- status = H5DOwrite_chunk(dataset, dxpl, filter_mask, offset, CHUNK_NY*CHUNK_NZ*sizeof(unsigned int), direct_buf[i]);
+ status = H5Dwrite_chunk(dataset, dxpl, filter_mask, offset, CHUNK_NY*CHUNK_NZ*sizeof(unsigned int), direct_buf[i]);
(offset[0])++;
}
@@ -369,7 +369,7 @@ test_direct_write_compressed_data(hid_t fapl_id)
/* Write the compressed chunk data repeatedly to cover all the chunks in the
* dataset, using the direct writing function. */
for(i=0; i<NX; i++) {
- status = H5DOwrite_chunk(dataset, dxpl, filter_mask, offset, data_size[i], outbuf[i]);
+ status = H5Dwrite_chunk(dataset, dxpl, filter_mask, offset, data_size[i], outbuf[i]);
(offset[0])++;
}
@@ -637,12 +637,6 @@ main (void)
hid_t fapl = H5P_DEFAULT;
int i;
- /* Testing setup */
-/* h5_reset();
- fapl = h5_fileaccess();
-
- h5_fixname(FILENAME[0], fapl, filename, sizeof filename);*/
-
sprintf(filename, "%s.h5", FILENAME[0]);
create_file(fapl);
@@ -657,7 +651,6 @@ main (void)
free(direct_buf[i]);
}
-/* h5_cleanup(FILENAME, fapl);*/
return 0;
}