diff options
author | Dana Robinson <derobins@hdfgroup.org> | 2018-05-31 23:14:24 (GMT) |
---|---|---|
committer | Dana Robinson <derobins@hdfgroup.org> | 2018-05-31 23:14:24 (GMT) |
commit | dec2f588acad45eaa02061d7d28774e5c6915f70 (patch) | |
tree | 5029cc9e0acf30aef5083e692574899f768c8d13 | |
parent | 1c7b0bc85713d4eafeb7c8157d6526b42826f0ca (diff) | |
parent | 1da9c5545c013ebc540ba3044810889d4acfa5be (diff) | |
download | hdf5-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.c | 233 | ||||
-rw-r--r-- | hl/src/H5DOpublic.h | 23 | ||||
-rw-r--r-- | hl/test/CMakeLists.txt | 2 | ||||
-rw-r--r-- | hl/test/CMakeTests.cmake | 4 | ||||
-rw-r--r-- | hl/test/Makefile.am | 8 | ||||
-rw-r--r-- | hl/test/test_h5do_compat.c | 286 | ||||
-rw-r--r-- | src/H5CX.c | 280 | ||||
-rw-r--r-- | src/H5CXprivate.h | 7 | ||||
-rw-r--r-- | src/H5Dio.c | 465 | ||||
-rw-r--r-- | src/H5Dpkg.h | 2 | ||||
-rw-r--r-- | src/H5Dpublic.h | 29 | ||||
-rw-r--r-- | src/H5Pdxpl.c | 65 | ||||
-rw-r--r-- | src/H5S.c | 53 | ||||
-rw-r--r-- | src/H5Sprivate.h | 1 | ||||
-rw-r--r-- | test/CMakeLists.txt | 1 | ||||
-rw-r--r-- | test/CMakeTests.cmake | 1 | ||||
-rw-r--r-- | test/Makefile.am | 13 | ||||
-rw-r--r-- | test/direct_chunk.c (renamed from hl/test/test_dset_opt.c) | 160 | ||||
-rw-r--r-- | test/testfiles/err_compat_1 | 2 | ||||
-rw-r--r-- | test/testfiles/error_test_1 | 4 | ||||
-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() */ @@ -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() */ @@ -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; } |