Merge pull request #1116 in HDFFV/hdf5 from ~HDFTEST/hdf5_hft:hdf5_1_10 to develop

* commit '25f80cbbec3a7d8036325784168b029cb71cc813': (324 commits)
  Snapshot version 1.10 release 3 (snap3)
  Update document
  HDFFV-10433 Updated text to address issues raised.
  Snapshot version 1.10 release 3 (snap2)
  Updated version to 1.10.3-snap2
  Merge corrections from develop
  HDFFV-10473 add note for attribute fix
  Correct attribute location
  HDFFV-9739 and cmake improvements merge from develop
  Fix for HDFFV-10469: set to latest format for virtual layout encoding.
  Update Windows test machines
  Fix soversion
  Fixed libver bounds underscore issue
  removed extraneous lib. ver. bound, PR comment
  temporary fix for HDFFV-10469
  Updated version to 1.10.3-snap1
  Add new file
  Correct number of tests
  Whitespace and test reclassify merge from develop
  HDFFV-10444 fix so numbers and merge java test changes
  ...
This commit is contained in:
hdftest 2018-06-24 17:37:20 -05:00
commit e9f476dad4
50 changed files with 1124 additions and 398 deletions

View File

@ -21,7 +21,7 @@ set (CTEST_NIGHTLY_START_TIME "18:00:00 CST")
set (CTEST_DROP_METHOD "http")
if (CDASH_LOCAL)
set (CTEST_DROP_SITE "cdash-internal.hdfgroup.org")
set (CTEST_DROP_LOCATION "/submit.php?project=HDF5Trunk")
set (CTEST_DROP_LOCATION "/submit.php?project=HDF5110")
else ()
set (CTEST_DROP_SITE "cdash.hdfgroup.org")
set (CTEST_DROP_LOCATION "/submit.php?project=HDF5")

View File

@ -1,4 +1,4 @@
HDF5 version 1.11.2 currently under development
HDF5 version 1.10.3-snap4 currently under development
------------------------------------------------------------------------------
Please refer to the release_docs/INSTALL file for installation instructions.

View File

@ -213,17 +213,18 @@ tar2cmakezip()
return 1
fi
# step 2: add batch file for building CMake on window
cp /mnt/scr1/pre-release/hdf5/CMake/build-VS2013-32.bat $cmziptmpdir
cp /mnt/scr1/pre-release/hdf5/CMake/build-VS2013-64.bat $cmziptmpdir
cp /mnt/scr1/pre-release/hdf5/CMake/build-VS2015-32.bat $cmziptmpdir
cp /mnt/scr1/pre-release/hdf5/CMake/build-VS2015-64.bat $cmziptmpdir
cp /mnt/scr1/pre-release/hdf5/CMake/build-VS2017-32.bat $cmziptmpdir
cp /mnt/scr1/pre-release/hdf5/CMake/build-VS2017-64.bat $cmziptmpdir
# step 2: add batch files for building CMake on windows
cp /mnt/scr1/pre-release/hdf5/CMake/HDF5_1_10/build-VS2013-32.bat $cmziptmpdir
cp /mnt/scr1/pre-release/hdf5/CMake/HDF5_1_10/build-VS2013-64.bat $cmziptmpdir
cp /mnt/scr1/pre-release/hdf5/CMake/HDF5_1_10/build-VS2015-32.bat $cmziptmpdir
cp /mnt/scr1/pre-release/hdf5/CMake/HDF5_1_10/build-VS2015-64.bat $cmziptmpdir
cp /mnt/scr1/pre-release/hdf5/CMake/HDF5_1_10/build-VS2017-32.bat $cmziptmpdir
cp /mnt/scr1/pre-release/hdf5/CMake/HDF5_1_10/build-VS2017-64.bat $cmziptmpdir
# step 3: add SZIP.tar.gz, ZLib.tar.gz and cmake files
cp /mnt/scr1/pre-release/hdf5/CMake/SZip.tar.gz $cmziptmpdir
cp /mnt/scr1/pre-release/hdf5/CMake/ZLib.tar.gz $cmziptmpdir
cp /mnt/scr1/pre-release/hdf5/CMake/HDF5Examples-1.10.7-Source.tar.gz $cmziptmpdir
cp $cmziptmpdir/$version/config/cmake/scripts/CTestScript.cmake $cmziptmpdir
cp $cmziptmpdir/$version/config/cmake/scripts/HDF5config.cmake $cmziptmpdir
cp $cmziptmpdir/$version/config/cmake/scripts/HDF5options.cmake $cmziptmpdir
@ -240,6 +241,10 @@ tar2cmakezip()
unix2dos -q -k $inf; \
fi\
done
mkdir $cmziptmpdir/CMake-$HDF5_VERS
mv $cmziptmpdir/* $cmziptmpdir/CMake-$HDF5_VERS
# step 3: make zipball
# -9 maximum compression
# -y Store symbolic links as such in the zip archive
@ -316,9 +321,12 @@ tar2cmaketgz()
# step 3: add SZIP.tar.gz, ZLib.tar.gz and cmake files
cp /mnt/scr1/pre-release/hdf5/CMake/SZip.tar.gz $cmgztmpdir
cp /mnt/scr1/pre-release/hdf5/CMake/ZLib.tar.gz $cmgztmpdir
cp /mnt/scr1/pre-release/hdf5/CMake/HDF5Examples-1.10.7-Source.tar.gz $cmgztmpdir
cp $cmgztmpdir/$version/config/cmake/scripts/CTestScript.cmake $cmgztmpdir
cp $cmgztmpdir/$version/config/cmake/scripts/HDF5config.cmake $cmgztmpdir
cp $cmgztmpdir/$version/config/cmake/scripts/HDF5options.cmake $cmgztmpdir
mkdir $cmgztmpdir/CMake-$HDF5_VERS
mv $cmgztmpdir/* $cmgztmpdir/CMake-$HDF5_VERS
tar czf $DEST/CMake-$HDF5_VERS.tar.gz -C $cmgztmpdir . || exit 1
# cleanup

View File

@ -38,7 +38,7 @@ PROJECT_NAME =
# could be handy for archiving the generated documentation or if some version
# control system is used.
PROJECT_NUMBER = "1.11.2"
PROJECT_NUMBER = "1.10.3-snap4, currently under development"
# Using the PROJECT_BRIEF tag one can provide an optional one line description
# for a project that appears at the top of each page and should give viewer a

View File

@ -34,8 +34,8 @@ cmake_minimum_required (VERSION 3.10)
# CTEST_SOURCE_NAME - source folder
##############################################################################
set (CTEST_SOURCE_VERSION "1.11.2")
set (CTEST_SOURCE_VERSEXT "")
set (CTEST_SOURCE_VERSION "1.10.3")
set (CTEST_SOURCE_VERSEXT "-snap4")
##############################################################################
# handle input parameters to script.
@ -184,7 +184,7 @@ set (MODEL "Experimental")
##### Following controls source update #####
#set (LOCAL_UPDATE "TRUE")
set (REPOSITORY_URL "https://git@bitbucket.hdfgroup.org/scm/hdffv/hdf5.git")
set (REPOSITORY_BRANCH "develop")
set (REPOSITORY_BRANCH "hdf5_1_10_2")
#uncomment to use a compressed source file: *.tar on linux or mac *.zip on windows
#set(CTEST_USE_TAR_SOURCE "${CTEST_SOURCE_VERSION}")

View File

@ -12,13 +12,13 @@
## If you do not have access to either file, you may request a copy from
## help@hdfgroup.org.
##
# Add libtool shared library version numbers to the HDF5 library
# See libtool versioning documentation online.
# After making changes, run bin/reconfigure to update other configure related
# files like Makefile.in.
LT_VERS_INTERFACE = 1000
LT_VERS_AGE = 0
## Add libtool shared library version numbers to the HDF5 library
## See libtool versioning documentation online.
## After making changes, run bin/reconfigure to update other configure related
## files like Makefile.in.
LT_VERS_INTERFACE = 102
LT_VERS_REVISION = 0
LT_VERS_AGE = 1
## If the API changes *at all*, increment LT_VERS_INTERFACE and
## reset LT_VERS_REVISION to 0.
@ -39,31 +39,31 @@ LT_VERS_REVISION = 0
## the effects of the H5_V1_x_COMPAT flag.
##
## Version numbers for wrapper shared library files.
LT_CXX_VERS_INTERFACE = 1000
LT_CXX_VERS_INTERFACE = 102
LT_CXX_VERS_REVISION = 0
LT_CXX_VERS_AGE = 0
LT_F_VERS_INTERFACE = 1000
LT_F_VERS_REVISION = 0
LT_F_VERS_AGE = 0
LT_F_VERS_INTERFACE = 101
LT_F_VERS_REVISION = 1
LT_F_VERS_AGE = 1
LT_HL_VERS_INTERFACE = 1000
LT_HL_VERS_INTERFACE = 101
LT_HL_VERS_REVISION = 0
LT_HL_VERS_AGE = 0
LT_HL_VERS_AGE = 1
LT_HL_CXX_VERS_INTERFACE = 1000
LT_HL_CXX_VERS_REVISION = 0
LT_HL_CXX_VERS_AGE = 0
LT_HL_CXX_VERS_INTERFACE = 101
LT_HL_CXX_VERS_REVISION = 1
LT_HL_CXX_VERS_AGE = 1
LT_HL_F_VERS_INTERFACE = 1000
LT_HL_F_VERS_REVISION = 0
LT_HL_F_VERS_INTERFACE = 100
LT_HL_F_VERS_REVISION = 2
LT_HL_F_VERS_AGE = 0
LT_JAVA_VERS_INTERFACE = 1000
LT_JAVA_VERS_INTERFACE = 102
LT_JAVA_VERS_REVISION = 0
LT_JAVA_VERS_AGE = 0
LT_JAVA_VERS_AGE = 2
LT_TOOLS_VERS_INTERFACE = 1000
LT_TOOLS_VERS_INTERFACE = 101
LT_TOOLS_VERS_REVISION = 0
LT_TOOLS_VERS_AGE = 0
LT_TOOLS_VERS_AGE = 1

View File

@ -24,7 +24,7 @@ AC_PREREQ([2.69])
## NOTE: Do not forget to change the version number here when we do a
## release!!!
##
AC_INIT([HDF5], [1.11.2], [help@hdfgroup.org])
AC_INIT([HDF5], [1.10.3-snap4], [help@hdfgroup.org])
AC_CONFIG_SRCDIR([src/H5.c])
AC_CONFIG_HEADERS([src/H5config.h])

View File

@ -214,7 +214,7 @@ import hdf.hdf5lib.structs.H5O_info_t;
* exception handlers to print out the HDF-5 error stack.
* <hr>
*
* @version HDF5 1.11.2 <BR>
* @version HDF5 1.10.3 <BR>
* <b>See also: <a href ="./hdf.hdf5lib.HDFArray.html"> hdf.hdf5lib.HDFArray</a> </b><BR>
* <a href ="./hdf.hdf5lib.HDF5Constants.html"> hdf.hdf5lib.HDF5Constants</a><BR>
* <a href ="./hdf.hdf5lib.HDF5CDataTypes.html"> hdf.hdf5lib.HDF5CDataTypes</a><BR>
@ -237,7 +237,7 @@ public class H5 implements java.io.Serializable {
*
* Make sure to update the versions number when a different library is used.
*/
public final static int LIB_VERSION[] = { 1, 11, 2 };
public final static int LIB_VERSION[] = { 1, 10, 3 };
public final static String H5PATH_PROPERTY_KEY = "hdf.hdf5lib.H5.hdf5lib";

View File

@ -162,7 +162,7 @@ public class TestH5 {
*/
@Test
public void testH5get_libversion() {
int libversion[] = { 1, 11, 2 };
int libversion[] = { 1, 10, 3 };
try {
H5.H5get_libversion(libversion);
@ -184,7 +184,7 @@ public class TestH5 {
*/
@Test
public void testH5check_version() {
int majnum = 1, minnum = 11, relnum = 2;
int majnum = 1, minnum = 10, relnum = 3;
try {
H5.H5check_version(majnum, minnum, relnum);

View File

@ -57,4 +57,4 @@ HDF5-DIAG: Error detected in HDF5 (version (number)) thread (IDs):
minor: Can't get value
#003: (file name) line (number) in H5FD_get_class(): can't find object for ID
major: Object atom
minor: Unable to find atom information (already closed?)
minor: Unable to find atom information (already closed?)

View File

@ -1,4 +1,4 @@
HDF5 version 1.11.2 currently under development
HDF5 version 1.10.3-snap4 currently under development
================================================================================
@ -61,6 +61,7 @@ New Features
----------------
-
C++ Library:
------------
-
@ -201,6 +202,7 @@ Bug Fixes since HDF5-1.10.2 release
Testing
-------
-
Supported Platforms
===================
@ -249,6 +251,9 @@ Supported Platforms
64-bit gfortran GNU Fortran (GCC) 7.1.0
(swallow/kite) Intel icc/icpc/ifort version 17.0.2
Mac OS Sierra 10.12.6 Apple LLVM version 8.1.0 (clang/clang++-802.0.42)
64-bit gfortran GNU Fortran (GCC) 7.1.0
(swallow/kite) Intel icc/icpc/ifort version 17.0.2
Tested Configuration Features Summary
=====================================
@ -274,15 +279,13 @@ Windows 7 x64 Cygwin n y/n n y y y
Windows 10 y y/y n y y y
Windows 10 x64 y y/y n y y y
Mac OS X Mountain Lion 10.8.5 64-bit n y/y n y y y
Mac OS X Mavericks 10.9.5 64-bit n y/y n y y ?
Mac OS X Yosemite 10.10.5 64-bit n y/y n y y ?
Mac OS X El Capitan 10.11.6 64-bit n y/y n y y ?
CentOS 6.7 Linux 2.6.18 x86_64 GNU n y/y n y y y
CentOS 6.7 Linux 2.6.18 x86_64 Intel n y/y n y y y
CentOS 6.7 Linux 2.6.32 x86_64 PGI n y/y n y y y
Mac OS X Mavericks 10.9.5 64-bit n y/y n y y y
Mac OS X Yosemite 10.10.5 64-bit n y/y n y y y
Mac OS X El Capitan 10.11.6 64-bit n y/y n y y y
CentOS 7.2 Linux 2.6.32 x86_64 PGI n y/y n y y y
CentOS 7.2 Linux 2.6.32 x86_64 GNU y y/y y y y y
CentOS 7.2 Linux 2.6.32 x86_64 Intel n y/y n y y y
Linux 2.6.32-573.18.1.el6.ppc64 n y/n n y y y
Linux 2.6.32-573.18.1.el6.ppc64 n y/y n y y y
Platform Shared Shared Shared Thread-
@ -299,10 +302,8 @@ Mac OS X Mountain Lion 10.8.5 64-bit y n y y
Mac OS X Mavericks 10.9.5 64-bit y n y y
Mac OS X Yosemite 10.10.5 64-bit y n y y
Mac OS X El Capitan 10.11.6 64-bit y n y y
CentOS 6.7 Linux 2.6.18 x86_64 GNU y y y y
CentOS 6.7 Linux 2.6.18 x86_64 Intel y y y n
CentOS 6.7 Linux 2.6.32 x86_64 PGI y y y n
CentOS 7.2 Linux 2.6.32 x86_64 GNU y y y n
CentOS 7.2 Linux 2.6.32 x86_64 PGI y y y n
CentOS 7.2 Linux 2.6.32 x86_64 GNU y y y y
CentOS 7.2 Linux 2.6.32 x86_64 Intel y y y n
Linux 2.6.32-573.18.1.el6.ppc64 y y y n
@ -371,6 +372,12 @@ Known Problems
images, but since this is a collective operation, a deadlock is possible
if one or more processes do not participate.
Three tests fail with OpenMPI 3.0.0/GCC-7.2.0-2.29:
testphdf5 (ecdsetw, selnone, cchunk1, cchunk3, cchunk4, and actualio)
t_shapesame (sscontig2)
t_pflush1/fails on exit
The first two tests fail attempting collective writes.
Known problems in previous releases can be found in the HISTORY*.txt files
in the HDF5 source. Please report any new problems found to
help@hdfgroup.org.

View File

@ -1931,7 +1931,7 @@ H5D__chunk_file_cb(void H5_ATTR_UNUSED *elem, const H5T_t H5_ATTR_UNUSED *type,
coords_in_chunk[u] = coords[u] - (scaled[u] * fm->layout->u.chunk.dim[u]);
/* Add point to file selection for chunk */
if(H5S_select_elements(chunk_info->fspace, H5S_SELECT_APPEND, (size_t)1, coords_in_chunk) < 0)
if(H5S_select_elements(chunk_info->fspace, H5S_SELECT_APPEND, (hsize_t)1, coords_in_chunk) < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTSELECT, FAIL, "unable to select element")
/* Increment the number of elemented selected in chunk */
@ -2011,7 +2011,7 @@ H5D__chunk_mem_cb(void H5_ATTR_UNUSED *elem, const H5T_t H5_ATTR_UNUSED *type, u
} /* end else */
/* Move memory selection iterator to next element in selection */
if(H5S_SELECT_ITER_NEXT(&fm->mem_iter, (size_t)1) < 0)
if(H5S_SELECT_ITER_NEXT(&fm->mem_iter, (hsize_t)1) < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTNEXT, FAIL, "unable to move to next iterator location")
done:

View File

@ -2506,7 +2506,7 @@ H5D__vlen_get_buf_size(void H5_ATTR_UNUSED *elem, hid_t type_id,
HGOTO_ERROR(H5E_DATASET, H5E_NOSPACE, FAIL, "can't resize tbuf")
/* Select point to read in */
if(H5S_select_elements(vlen_bufsize->fspace, H5S_SELECT_SET, (size_t)1, point) < 0)
if(H5S_select_elements(vlen_bufsize->fspace, H5S_SELECT_SET, (hsize_t)1, point) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTCREATE, FAIL, "can't select point")
/* Read in the point (with the custom VL memory allocator) */

View File

@ -2630,6 +2630,7 @@ H5D__chunk_redistribute_shared_chunks(const H5D_io_info_t *io_info, const H5D_ty
int *send_displacements = NULL;
int scatter_recvcount_int;
int mpi_rank, mpi_size, mpi_code;
hid_t fapl_id = -1; /* File access property list for H5S_encode() */
herr_t ret_value = SUCCEED;
FUNC_ENTER_STATIC
@ -2644,6 +2645,9 @@ H5D__chunk_redistribute_shared_chunks(const H5D_io_info_t *io_info, const H5D_ty
if ((mpi_size = H5F_mpi_get_size(io_info->dset->oloc.file)) < 0)
HGOTO_ERROR(H5E_IO, H5E_MPI, FAIL, "unable to obtain mpi size")
if((fapl_id = H5F_get_access_plist(io_info->dset->oloc.file, FALSE)) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get fapl")
if (*local_chunk_array_num_entries)
if (NULL == (send_requests = (MPI_Request *) H5MM_malloc(*local_chunk_array_num_entries * sizeof(MPI_Request))))
HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "couldn't allocate send requests buffer")
@ -2749,7 +2753,7 @@ H5D__chunk_redistribute_shared_chunks(const H5D_io_info_t *io_info, const H5D_ty
/* Determine size of serialized chunk file dataspace, plus the size of
* the data being written
*/
if (H5S_encode(chunk_info->fspace, &mod_data_p, &mod_data_size) < 0)
if (H5S_encode(chunk_info->fspace, &mod_data_p, &mod_data_size, fapl_id) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTENCODE, FAIL, "unable to get encoded dataspace size")
if ((iter_nelmts = H5S_GET_SELECT_NPOINTS(chunk_info->mspace)) < 0)
@ -2762,7 +2766,7 @@ H5D__chunk_redistribute_shared_chunks(const H5D_io_info_t *io_info, const H5D_ty
/* Serialize the chunk's file dataspace into the buffer */
mod_data_p = mod_data[num_send_requests];
if (H5S_encode(chunk_info->fspace, &mod_data_p, &mod_data_size) < 0)
if (H5S_encode(chunk_info->fspace, &mod_data_p, &mod_data_size, fapl_id) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTENCODE, FAIL, "unable to encode dataspace")
/* Intialize iterator for memory selection */

View File

@ -417,6 +417,11 @@ H5D__virtual_store_layout(H5F_t *f, H5O_layout_t *layout)
hsize_t tmp_nentries; /* Temp. variable for # of VDS entries */
uint32_t chksum; /* Checksum for heap data */
size_t i; /* Local index variable */
H5P_genplist_t *fapl_plist; /* The file access property list */
hid_t new_fapl_id; /* The file access property list ID */
H5F_libver_t low_bound = H5F_LIBVER_V110; /* Set the low bound in fapl to latest */
H5F_libver_t high_bound = H5F_LIBVER_V110; /* Set the high bound in fapl to latest */
H5F_t *tmp_f = NULL; /* Pointer to faked file structure */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_PACKAGE
@ -428,6 +433,24 @@ H5D__virtual_store_layout(H5F_t *f, H5O_layout_t *layout)
/* Create block if # of used entries > 0 */
if(layout->storage.u.virt.list_nused > 0) {
/* Make a copy of the default file access property list */
if(NULL == (fapl_plist = (H5P_genplist_t *)H5I_object(H5P_LST_FILE_ACCESS_ID_g)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list")
/* Set latest format in fapl_plist for virtual layout encoding */
if(H5P_set(fapl_plist, H5F_ACS_LIBVER_LOW_BOUND_NAME, &low_bound) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set 'low' bound for library format versions")
if(H5P_set(fapl_plist, H5F_ACS_LIBVER_HIGH_BOUND_NAME, &high_bound) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set 'high' bound for library format versions")
/* Copy and return the fapl id */
if((new_fapl_id = H5P_copy_plist(fapl_plist, FALSE)) < 0)
HGOTO_ERROR(H5E_INTERNAL, H5E_CANTINIT, FAIL, "can't copy file access property list")
/* Allocate "fake" file structure with the fapl setting */
if(NULL == (tmp_f = H5F_fake_alloc((uint8_t)0, new_fapl_id)))
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, FAIL, "can't allocate fake file struct")
/* Allocate array for caching results of strlen */
if(NULL == (str_size = (size_t *)H5MM_malloc(2 * layout->storage.u.virt.list_nused * sizeof(size_t))))
HGOTO_ERROR(H5E_OHDR, H5E_RESOURCE, FAIL, "unable to allocate string length array")
@ -457,12 +480,12 @@ H5D__virtual_store_layout(H5F_t *f, H5O_layout_t *layout)
block_size += str_size[(2 * i) + 1];
/* Source selection */
if((select_serial_size = H5S_SELECT_SERIAL_SIZE(layout->storage.u.virt.list[i].source_select)) < 0)
if((select_serial_size = H5S_SELECT_SERIAL_SIZE(layout->storage.u.virt.list[i].source_select, tmp_f)) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTENCODE, FAIL, "unable to check dataspace selection size")
block_size += (size_t)select_serial_size;
/* Virtual dataset selection */
if((select_serial_size = H5S_SELECT_SERIAL_SIZE(layout->storage.u.virt.list[i].source_dset.virtual_select)) < 0)
if((select_serial_size = H5S_SELECT_SERIAL_SIZE(layout->storage.u.virt.list[i].source_dset.virtual_select, tmp_f)) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTENCODE, FAIL, "unable to check dataspace selection size")
block_size += (size_t)select_serial_size;
} /* end for */
@ -499,11 +522,11 @@ H5D__virtual_store_layout(H5F_t *f, H5O_layout_t *layout)
heap_block_p += str_size[(2 * i) + 1];
/* Source selection */
if(H5S_SELECT_SERIALIZE(layout->storage.u.virt.list[i].source_select, &heap_block_p) < 0)
if(H5S_SELECT_SERIALIZE(layout->storage.u.virt.list[i].source_select, &heap_block_p, tmp_f) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, FAIL, "unable to serialize source selection")
/* Virtual selection */
if(H5S_SELECT_SERIALIZE(layout->storage.u.virt.list[i].source_dset.virtual_select, &heap_block_p) < 0)
if(H5S_SELECT_SERIALIZE(layout->storage.u.virt.list[i].source_dset.virtual_select, &heap_block_p, tmp_f) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, FAIL, "unable to serialize virtual selection")
} /* end for */
@ -517,9 +540,14 @@ H5D__virtual_store_layout(H5F_t *f, H5O_layout_t *layout)
} /* end if */
done:
/* Release fake file structure */
if(tmp_f && H5F_fake_free(tmp_f) < 0)
HDONE_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "unable to release fake file struct")
heap_block = (uint8_t *)H5MM_xfree(heap_block);
str_size = (size_t *)H5MM_xfree(str_size);
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5D__virtual_store_layout() */

View File

@ -149,7 +149,7 @@ done:
* Purpose: Enable switching between latest or non-latest format while
* a file is open.
* This is deprecated starting release 1.10.2 and is modified
* to call the private H5F_set_libver_bounds() to set the
* to call the private H5F__set_libver_bounds() to set the
* bounds.
*
* Before release 1.10.2, the library supports only two

View File

@ -18,6 +18,8 @@
#include "H5private.h" /* Generic Functions */
#include "H5Eprivate.h" /* Error handling */
#include "H5Fpkg.h" /* File access */
#include "H5Iprivate.h" /* IDs */
#include "H5Pprivate.h" /* Property lists */
/* PRIVATE PROTOTYPES */
@ -40,9 +42,10 @@
*-------------------------------------------------------------------------
*/
H5F_t *
H5F_fake_alloc(uint8_t sizeof_size)
H5F_fake_alloc(uint8_t sizeof_size, hid_t fapl_id)
{
H5F_t *f = NULL; /* Pointer to fake file struct */
H5P_genplist_t *plist; /* Property list */
H5F_t *ret_value = NULL; /* Return value */
FUNC_ENTER_NOAPI(NULL)
@ -59,6 +62,16 @@ H5F_fake_alloc(uint8_t sizeof_size)
else
f->shared->sizeof_size = sizeof_size;
/* Set low/high bounds according to the setting in fapl_id */
/* See H5F_new() in H5Fint.c */
if(NULL == (plist = (H5P_genplist_t *)H5I_object(fapl_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not file access property list")
if(H5P_get(plist, H5F_ACS_LIBVER_LOW_BOUND_NAME, &(f->shared->low_bound)) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get 'low' bound for library format versions")
if(H5P_get(plist, H5F_ACS_LIBVER_HIGH_BOUND_NAME, &(f->shared->high_bound)) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get 'high' bound for library format versions")
/* Set return value */
ret_value = f;

View File

@ -2762,7 +2762,7 @@ H5F_set_store_msg_crt_idx(H5F_t *f, hbool_t flag)
/*-------------------------------------------------------------------------
* Function: H5F_set_libver_bounds()
* Function: H5F__set_libver_bounds()
*
* Purpose: Set the file's low and high bound to the input parameters
* 'low' and 'high' respectively.
@ -2818,7 +2818,7 @@ H5F__set_libver_bounds(H5F_t *f, H5F_libver_t low, H5F_libver_t high)
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* H5F_set_libver_bounds() */
} /* H5F__set_libver_bounds() */
/*-------------------------------------------------------------------------

View File

@ -821,7 +821,7 @@ H5_DLL void H5F_addr_decode_len(size_t addr_len, const uint8_t **pp, haddr_t *ad
H5_DLL void H5F_sfile_assert_num(unsigned n);
/* Routines for creating & destroying "fake" file structures */
H5_DLL H5F_t *H5F_fake_alloc(uint8_t sizeof_size);
H5_DLL H5F_t *H5F_fake_alloc(uint8_t sizeof_size, hid_t fapl_id);
H5_DLL herr_t H5F_fake_free(H5F_t *f);
/* Superblock related routines */

View File

@ -548,8 +548,10 @@ done:
static herr_t
H5O__layout_encode(H5F_t *f, hbool_t H5_ATTR_UNUSED disable_shared, uint8_t *p, const void *_mesg)
{
const H5O_layout_t *mesg = (const H5O_layout_t *) _mesg;
unsigned u;
const H5O_layout_t *mesg = (const H5O_layout_t *) _mesg;
uint8_t *heap_block = NULL;
size_t *str_size = NULL;
unsigned u;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_STATIC
@ -685,6 +687,10 @@ H5O__layout_encode(H5F_t *f, hbool_t H5_ATTR_UNUSED disable_shared, uint8_t *p,
} /* end switch */
done:
heap_block = (uint8_t *)H5MM_xfree(heap_block);
str_size = (size_t *)H5MM_xfree(str_size);
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5O__layout_encode() */

View File

@ -840,6 +840,10 @@ herr_t
H5Pencode(hid_t plist_id, void *buf, size_t *nalloc)
{
H5P_genplist_t *plist; /* Property list to query */
H5P_genplist_t *fapl_plist;
hid_t new_fapl_id;
H5F_libver_t low_bound = H5F_LIBVER_V110;
H5F_libver_t high_bound = H5F_LIBVER_V110;
herr_t ret_value = SUCCEED; /* return value */
FUNC_ENTER_API(FAIL)
@ -850,7 +854,7 @@ H5Pencode(hid_t plist_id, void *buf, size_t *nalloc)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list");
/* Call the internal encode routine */
if((ret_value = H5P__encode(plist, TRUE, buf, nalloc)) < 0)
if((ret_value = H5P__encode(plist, TRUE, buf, nalloc, H5P_FILE_ACCESS_DEFAULT)) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTENCODE, FAIL, "unable to encode property list");
done:

View File

@ -121,7 +121,7 @@ static herr_t H5P__encode_chunk_cache_nbytes(const void *value, void **_pp,
static herr_t H5P__decode_chunk_cache_nbytes(const void **_pp, void *_value);
/* Property list callbacks */
static herr_t H5P__dacc_vds_view_enc(const void *value, void **pp, size_t *size);
static herr_t H5P__dacc_vds_view_enc(const void *value, void **pp, size_t *size, void *udata);
static herr_t H5P__dacc_vds_view_dec(const void **pp, void *value);
static herr_t H5P__dapl_vds_file_pref_set(hid_t prop_id, const char* name, size_t size, void* value);
static herr_t H5P__dapl_vds_file_pref_get(hid_t prop_id, const char* name, size_t size, void* value);
@ -135,7 +135,7 @@ static herr_t H5P__dapl_vds_file_pref_close(const char* name, size_t size, void*
/* Property list callbacks */
static herr_t H5P__dapl_efile_pref_set(hid_t prop_id, const char* name, size_t size, void* value);
static herr_t H5P__dapl_efile_pref_get(hid_t prop_id, const char* name, size_t size, void* value);
static herr_t H5P__dapl_efile_pref_enc(const void *value, void **_pp, size_t *size);
static herr_t H5P__dapl_efile_pref_enc(const void *value, void **_pp, size_t *size, void *udata);
static herr_t H5P__dapl_efile_pref_dec(const void **_pp, void *value);
static herr_t H5P__dapl_efile_pref_del(hid_t prop_id, const char* name, size_t size, void* value);
static herr_t H5P__dapl_efile_pref_copy(const char* name, size_t size, void* value);
@ -562,7 +562,7 @@ H5P__dapl_efile_pref_get(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED
*-------------------------------------------------------------------------
*/
static herr_t
H5P__dapl_efile_pref_enc(const void *value, void **_pp, size_t *size)
H5P__dapl_efile_pref_enc(const void *value, void **_pp, size_t *size, void H5_ATTR_UNUSED *udata)
{
const char *efile_pref = *(const char * const *)value;
uint8_t **pp = (uint8_t **)_pp;
@ -1157,7 +1157,7 @@ done:
*-------------------------------------------------------------------------
*/
static herr_t
H5P__dacc_vds_view_enc(const void *value, void **_pp, size_t *size)
H5P__dacc_vds_view_enc(const void *value, void **_pp, size_t *size, void H5_ATTR_UNUSED *udata)
{
const H5D_vds_view_t *view = (const H5D_vds_view_t *)value; /* Create local alias for values */
uint8_t **pp = (uint8_t **)_pp;

View File

@ -147,7 +147,7 @@ static herr_t H5P__dcrt_reg_prop(H5P_genclass_t *pclass);
/* Property callbacks */
static herr_t H5P__dcrt_layout_set(hid_t prop_id, const char *name, size_t size, void *value);
static herr_t H5P__dcrt_layout_get(hid_t prop_id, const char *name, size_t size, void *value);
static herr_t H5P__dcrt_layout_enc(const void *value, void **pp, size_t *size);
static herr_t H5P__dcrt_layout_enc(const void *value, void **pp, size_t *size, void *udata);
static herr_t H5P__dcrt_layout_dec(const void **pp, void *value);
static herr_t H5P__dcrt_layout_del(hid_t prop_id, const char *name, size_t size, void *value);
static herr_t H5P__dcrt_layout_copy(const char *name, size_t size, void *value);
@ -155,14 +155,14 @@ static int H5P__dcrt_layout_cmp(const void *value1, const void *value2, size_t s
static herr_t H5P__dcrt_layout_close(const char *name, size_t size, void *value);
static herr_t H5P__dcrt_fill_value_set(hid_t prop_id, const char *name, size_t size, void *value);
static herr_t H5P__dcrt_fill_value_get(hid_t prop_id, const char *name, size_t size, void *value);
static herr_t H5P__dcrt_fill_value_enc(const void *value, void **pp, size_t *size);
static herr_t H5P__dcrt_fill_value_enc(const void *value, void **pp, size_t *size, void *udata);
static herr_t H5P__dcrt_fill_value_dec(const void **pp, void *value);
static herr_t H5P__dcrt_fill_value_del(hid_t prop_id, const char *name, size_t size, void *value);
static herr_t H5P__dcrt_fill_value_copy(const char *name, size_t size, void *value);
static herr_t H5P__dcrt_fill_value_close(const char *name, size_t size, void *value);
static herr_t H5P__dcrt_ext_file_list_set(hid_t prop_id, const char *name, size_t size, void *value);
static herr_t H5P__dcrt_ext_file_list_get(hid_t prop_id, const char *name, size_t size, void *value);
static herr_t H5P__dcrt_ext_file_list_enc(const void *value, void **pp, size_t *size);
static herr_t H5P__dcrt_ext_file_list_enc(const void *value, void **pp, size_t *size, void *udata);
static herr_t H5P__dcrt_ext_file_list_dec(const void **pp, void *value);
static herr_t H5P__dcrt_ext_file_list_del(hid_t prop_id, const char *name, size_t size, void *value);
static herr_t H5P__dcrt_ext_file_list_copy(const char *name, size_t size, void *value);
@ -367,21 +367,41 @@ done:
*-------------------------------------------------------------------------
*/
static herr_t
H5P__dcrt_layout_enc(const void *value, void **_pp, size_t *size)
H5P__dcrt_layout_enc(const void *value, void **_pp, size_t *size, void *_udata)
{
const H5O_layout_t *layout = (const H5O_layout_t *)value; /* Create local aliases for values */
H5P_enc_cb_info_t *udata = (H5P_enc_cb_info_t *)_udata; /* User data for encode callback */
uint8_t **pp = (uint8_t **)_pp;
uint8_t *tmp_p;
size_t tmp_size;
size_t u; /* Local index variable */
H5P_genplist_t *fapl_plist; /* The file access property list */
hid_t new_fapl_id; /* The file access property list ID */
H5F_libver_t low_bound = H5F_LIBVER_V110; /* Set the low bound in fapl to latest */
H5F_libver_t high_bound = H5F_LIBVER_V110; /* Set the high bound in fapl to latest */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_STATIC
/* Sanity check */
HDassert(layout);
HDassert(size);
/* Make a copy of the default file access property list */
if(NULL == (fapl_plist = (H5P_genplist_t *)H5I_object(H5P_LST_FILE_ACCESS_ID_g)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list")
/* Set latest format in fapl_plist */
/* This will eventually be used by VDS to encode datasets via H5S_encode() */
if(H5P_set(fapl_plist, H5F_ACS_LIBVER_LOW_BOUND_NAME, &low_bound) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set 'low' bound for library format versions")
if(H5P_set(fapl_plist, H5F_ACS_LIBVER_HIGH_BOUND_NAME, &high_bound) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set 'high' bound for library format versions")
if((new_fapl_id = H5P_copy_plist(fapl_plist, FALSE)) < 0)
HGOTO_ERROR(H5E_INTERNAL, H5E_CANTINIT, FAIL, "can't copy file access property list")
if(NULL != *pp) {
/* Encode layout type */
*(*pp)++ = (uint8_t)layout->type;
@ -427,14 +447,15 @@ H5P__dcrt_layout_enc(const void *value, void **_pp, size_t *size)
* list before we get here. */
tmp_size = (size_t)-1;
tmp_p = *pp;
if(H5S_encode(layout->storage.u.virt.list[u].source_select, pp, &tmp_size) < 0)
if(H5S_encode(layout->storage.u.virt.list[u].source_select, pp, &tmp_size, new_fapl_id) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTENCODE, FAIL, "unable to serialize source selection")
*size += (size_t)(*pp - tmp_p);
/* Virtual dataset selection. Same notes as above apply. */
tmp_size = (size_t)-1;
tmp_p = *pp;
if(H5S_encode(layout->storage.u.virt.list[u].source_dset.virtual_select, pp, &tmp_size) < 0)
if(H5S_encode(layout->storage.u.virt.list[u].source_dset.virtual_select, pp, &tmp_size, new_fapl_id) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTENCODE, FAIL, "unable to serialize virtual selection")
*size += (size_t)(*pp - tmp_p);
} /* end for */
@ -467,14 +488,14 @@ H5P__dcrt_layout_enc(const void *value, void **_pp, size_t *size)
/* Source selection */
tmp_size = (size_t)0;
tmp_p = NULL;
if(H5S_encode(layout->storage.u.virt.list[u].source_select, &tmp_p, &tmp_size) < 0)
if(H5S_encode(layout->storage.u.virt.list[u].source_select, &tmp_p, &tmp_size, new_fapl_id) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTENCODE, FAIL, "unable to serialize source selection")
*size += tmp_size;
/* Virtual dataset selection */
tmp_size = (size_t)0;
tmp_p = NULL;
if(H5S_encode(layout->storage.u.virt.list[u].source_dset.virtual_select, &tmp_p, &tmp_size) < 0)
if(H5S_encode(layout->storage.u.virt.list[u].source_dset.virtual_select, &tmp_p, &tmp_size, new_fapl_id) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTENCODE, FAIL, "unable to serialize virtual selection")
*size += tmp_size;
} /* end for */
@ -980,7 +1001,7 @@ done:
*-------------------------------------------------------------------------
*/
static herr_t
H5P__dcrt_fill_value_enc(const void *value, void **_pp, size_t *size)
H5P__dcrt_fill_value_enc(const void *value, void **_pp, size_t *size, void H5_ATTR_UNUSED *udata)
{
const H5O_fill_t *fill = (const H5O_fill_t *)value; /* Create local aliases for values */
size_t dt_size = 0; /* Size of encoded datatype */
@ -1383,7 +1404,7 @@ done:
*-------------------------------------------------------------------------
*/
static herr_t
H5P__dcrt_ext_file_list_enc(const void *value, void **_pp, size_t *size)
H5P__dcrt_ext_file_list_enc(const void *value, void **_pp, size_t *size, void H5_ATTR_UNUSED *udata)
{
const H5O_efl_t *efl = (const H5O_efl_t *)value; /* Create local aliases for values */
size_t len = 0; /* String length of slot name */

View File

@ -172,21 +172,21 @@
static herr_t H5P__dxfr_reg_prop(H5P_genclass_t *pclass);
/* Property list callbacks */
static herr_t H5P__dxfr_bkgr_buf_type_enc(const void *value, void **pp, size_t *size);
static herr_t H5P__dxfr_bkgr_buf_type_enc(const void *value, void **pp, size_t *size, void *udata);
static herr_t H5P__dxfr_bkgr_buf_type_dec(const void **pp, void *value);
static herr_t H5P__dxfr_btree_split_ratio_enc(const void *value, void **pp, size_t *size);
static herr_t H5P__dxfr_btree_split_ratio_enc(const void *value, void **pp, size_t *size, void *udata);
static herr_t H5P__dxfr_btree_split_ratio_dec(const void **pp, void *value);
static herr_t H5P__dxfr_io_xfer_mode_enc(const void *value, void **pp, size_t *size);
static herr_t H5P__dxfr_io_xfer_mode_enc(const void *value, void **pp, size_t *size, void *udata);
static herr_t H5P__dxfr_io_xfer_mode_dec(const void **pp, void *value);
static herr_t H5P__dxfr_mpio_collective_opt_enc(const void *value, void **pp, size_t *size);
static herr_t H5P__dxfr_mpio_collective_opt_enc(const void *value, void **pp, size_t *size, void *udata);
static herr_t H5P__dxfr_mpio_collective_opt_dec(const void **pp, void *value);
static herr_t H5P__dxfr_mpio_chunk_opt_hard_enc(const void *value, void **pp, size_t *size);
static herr_t H5P__dxfr_mpio_chunk_opt_hard_enc(const void *value, void **pp, size_t *size, void *udata);
static herr_t H5P__dxfr_mpio_chunk_opt_hard_dec(const void **pp, void *value);
static herr_t H5P__dxfr_edc_enc(const void *value, void **pp, size_t *size);
static herr_t H5P__dxfr_edc_enc(const void *value, void **pp, size_t *size, void *udata);
static herr_t H5P__dxfr_edc_dec(const void **pp, void *value);
static herr_t H5P__dxfr_xform_set(hid_t prop_id, const char* name, size_t size, void* value);
static herr_t H5P__dxfr_xform_get(hid_t prop_id, const char* name, size_t size, void* value);
static herr_t H5P__dxfr_xform_enc(const void *value, void **pp, size_t *size);
static herr_t H5P__dxfr_xform_enc(const void *value, void **pp, size_t *size, void *udata);
static herr_t H5P__dxfr_xform_dec(const void **pp, void *value);
static herr_t H5P__dxfr_xform_del(hid_t prop_id, const char* name, size_t size, void* value);
static herr_t H5P__dxfr_xform_copy(const char* name, size_t size, void* value);
@ -421,7 +421,7 @@ done:
*-------------------------------------------------------------------------
*/
static herr_t
H5P__dxfr_bkgr_buf_type_enc(const void *value, void **_pp, size_t *size)
H5P__dxfr_bkgr_buf_type_enc(const void *value, void **_pp, size_t *size, void H5_ATTR_UNUSED *udata)
{
const H5T_bkg_t *bkgr_buf_type = (const H5T_bkg_t *)value; /* Create local alias for values */
uint8_t **pp = (uint8_t **)_pp;
@ -494,7 +494,7 @@ H5P__dxfr_bkgr_buf_type_dec(const void **_pp, void *_value)
*-------------------------------------------------------------------------
*/
static herr_t
H5P__dxfr_btree_split_ratio_enc(const void *value, void **_pp, size_t *size)
H5P__dxfr_btree_split_ratio_enc(const void *value, void **_pp, size_t *size, void H5_ATTR_UNUSED *udata)
{
const double *btree_split_ratio = (const double *)value; /* Create local alias for values */
uint8_t **pp = (uint8_t **)_pp;
@ -655,7 +655,7 @@ done:
*-------------------------------------------------------------------------
*/
static herr_t
H5P__dxfr_xform_enc(const void *value, void **_pp, size_t *size)
H5P__dxfr_xform_enc(const void *value, void **_pp, size_t *size, void H5_ATTR_UNUSED *udata)
{
const H5Z_data_xform_t *data_xform_prop = *(const H5Z_data_xform_t * const *)value; /* Create local alias for values */
const char *pexp = NULL; /* Pointer to transform expression */
@ -1743,7 +1743,7 @@ done:
*-------------------------------------------------------------------------
*/
static herr_t
H5P__dxfr_io_xfer_mode_enc(const void *value, void **_pp, size_t *size)
H5P__dxfr_io_xfer_mode_enc(const void *value, void **_pp, size_t *size, void H5_ATTR_UNUSED *udata)
{
const H5FD_mpio_xfer_t *xfer_mode = (const H5FD_mpio_xfer_t *)value; /* Create local alias for values */
uint8_t **pp = (uint8_t **)_pp;
@ -1816,7 +1816,7 @@ H5P__dxfr_io_xfer_mode_dec(const void **_pp, void *_value)
*-------------------------------------------------------------------------
*/
static herr_t
H5P__dxfr_mpio_collective_opt_enc(const void *value, void **_pp, size_t *size)
H5P__dxfr_mpio_collective_opt_enc(const void *value, void **_pp, size_t *size, void H5_ATTR_UNUSED *udata)
{
const H5FD_mpio_collective_opt_t *coll_opt = (const H5FD_mpio_collective_opt_t *)value; /* Create local alias for values */
uint8_t **pp = (uint8_t **)_pp;
@ -1889,7 +1889,7 @@ H5P__dxfr_mpio_collective_opt_dec(const void **_pp, void *_value)
*-------------------------------------------------------------------------
*/
static herr_t
H5P__dxfr_mpio_chunk_opt_hard_enc(const void *value, void **_pp, size_t *size)
H5P__dxfr_mpio_chunk_opt_hard_enc(const void *value, void **_pp, size_t *size, void H5_ATTR_UNUSED *udata)
{
const H5FD_mpio_chunk_opt_t *chunk_opt = (const H5FD_mpio_chunk_opt_t *)value; /* Create local alias for values */
uint8_t **pp = (uint8_t **)_pp;
@ -2074,7 +2074,7 @@ done:
*-------------------------------------------------------------------------
*/
static herr_t
H5P__dxfr_edc_enc(const void *value, void **_pp, size_t *size)
H5P__dxfr_edc_enc(const void *value, void **_pp, size_t *size, void H5_ATTR_UNUSED *udata)
{
const H5Z_EDC_t *check = (const H5Z_EDC_t *)value; /* Create local alias for values */
uint8_t **pp = (uint8_t **)_pp;

View File

@ -49,9 +49,10 @@
/* Typedef for iterator when encoding a property list */
typedef struct {
hbool_t encode; /* Whether the property list should be encoded */
size_t *enc_size_ptr; /* Pointer to size of encoded buffer */
void **pp; /* Pointer to encoding buffer pointer */
hbool_t encode; /* Whether the property list should be encoded */
size_t *enc_size_ptr; /* Pointer to size of encoded buffer */
void **pp; /* Pointer to encoding buffer pointer */
hid_t fapl_id; /* File access property list */
} H5P_enc_iter_ud_t;
@ -90,7 +91,7 @@ typedef struct {
*-------------------------------------------------------------------------
*/
herr_t
H5P__encode_size_t(const void *value, void **_pp, size_t *size)
H5P__encode_size_t(const void *value, void **_pp, size_t *size, void H5_ATTR_UNUSED *udata)
{
uint64_t enc_value = (uint64_t)*(const size_t *)value; /* Property value to encode */
uint8_t **pp = (uint8_t **)_pp;
@ -132,7 +133,7 @@ H5P__encode_size_t(const void *value, void **_pp, size_t *size)
*-------------------------------------------------------------------------
*/
herr_t
H5P__encode_hsize_t(const void *value, void **_pp, size_t *size)
H5P__encode_hsize_t(const void *value, void **_pp, size_t *size, void H5_ATTR_UNUSED *udata)
{
uint64_t enc_value = (uint64_t)*(const hsize_t *)value; /* Property value to encode */
unsigned enc_size = H5VM_limit_enc_size(enc_value); /* Size of encoded property */
@ -173,7 +174,7 @@ H5P__encode_hsize_t(const void *value, void **_pp, size_t *size)
*-------------------------------------------------------------------------
*/
herr_t
H5P__encode_unsigned(const void *value, void **_pp, size_t *size)
H5P__encode_unsigned(const void *value, void **_pp, size_t *size, void H5_ATTR_UNUSED *udata)
{
uint8_t **pp = (uint8_t **)_pp;
@ -212,7 +213,7 @@ H5P__encode_unsigned(const void *value, void **_pp, size_t *size)
*-------------------------------------------------------------------------
*/
herr_t
H5P__encode_uint8_t(const void *value, void **_pp, size_t *size)
H5P__encode_uint8_t(const void *value, void **_pp, size_t *size, void H5_ATTR_UNUSED *udata)
{
uint8_t **pp = (uint8_t **)_pp;
@ -248,7 +249,7 @@ H5P__encode_uint8_t(const void *value, void **_pp, size_t *size)
*-------------------------------------------------------------------------
*/
herr_t
H5P__encode_hbool_t(const void *value, void **_pp, size_t *size)
H5P__encode_hbool_t(const void *value, void **_pp, size_t *size, void H5_ATTR_UNUSED *udata)
{
uint8_t **pp = (uint8_t **)_pp;
@ -283,7 +284,7 @@ H5P__encode_hbool_t(const void *value, void **_pp, size_t *size)
*-------------------------------------------------------------------------
*/
herr_t
H5P__encode_double(const void *value, void **_pp, size_t *size)
H5P__encode_double(const void *value, void **_pp, size_t *size, void H5_ATTR_UNUSED *udata)
{
uint8_t **pp = (uint8_t **)_pp;
@ -332,7 +333,8 @@ static int
H5P__encode_cb(H5P_genprop_t *prop, void *_udata)
{
H5P_enc_iter_ud_t *udata = (H5P_enc_iter_ud_t *)_udata; /* Pointer to user data */
int ret_value = H5_ITER_CONT; /* Return value */
H5P_enc_cb_info_t cb_udata; /* User data for property iteration callback */
int ret_value = H5_ITER_CONT; /* Return value */
FUNC_ENTER_STATIC
@ -355,7 +357,8 @@ H5P__encode_cb(H5P_genprop_t *prop, void *_udata)
/* Encode (or not, if *(udata->pp) is NULL) the property value */
prop_value_len = 0;
if((prop->encode)(prop->value, udata->pp, &prop_value_len) < 0)
cb_udata.fapl_id = udata->fapl_id;
if((prop->encode)(prop->value, udata->pp, &prop_value_len, &cb_udata) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTENCODE, H5_ITER_ERROR, "property encoding routine failed")
*(udata->enc_size_ptr) += prop_value_len;
} /* end if */
@ -390,7 +393,7 @@ done:
--------------------------------------------------------------------------*/
herr_t
H5P__encode(const H5P_genplist_t *plist, hbool_t enc_all_prop, void *buf,
size_t *nalloc)
size_t *nalloc, hid_t fapl_id)
{
H5P_enc_iter_ud_t udata; /* User data for property iteration callback */
uint8_t *p = (uint8_t *)buf; /* Temporary pointer to encoding buffer */
@ -425,6 +428,7 @@ H5P__encode(const H5P_genplist_t *plist, hbool_t enc_all_prop, void *buf,
udata.encode = encode;
udata.enc_size_ptr = &encode_size;
udata.pp = (void **)&p;
udata.fapl_id = fapl_id;
/* Iterate over all properties in property list, encoding them */
idx = 0;

View File

@ -297,18 +297,18 @@ static int H5P__facc_file_image_info_cmp(const void *value1, const void *value2,
static herr_t H5P__facc_file_image_info_close(const char *name, size_t size, void *value);
/* encode & decode callbacks */
static herr_t H5P__facc_cache_config_enc(const void *value, void **_pp, size_t *size);
static herr_t H5P__facc_cache_config_enc(const void *value, void **_pp, size_t *size, void *udata);
static herr_t H5P__facc_cache_config_dec(const void **_pp, void *value);
static int H5P__facc_cache_config_cmp(const void *value1, const void *value2, size_t size);
static herr_t H5P__facc_fclose_degree_enc(const void *value, void **_pp, size_t *size);
static herr_t H5P__facc_fclose_degree_enc(const void *value, void **_pp, size_t *size, void *udata);
static herr_t H5P__facc_fclose_degree_dec(const void **pp, void *value);
static herr_t H5P__facc_multi_type_enc(const void *value, void **_pp, size_t *size);
static herr_t H5P__facc_multi_type_enc(const void *value, void **_pp, size_t *size, void *udata);
static herr_t H5P__facc_multi_type_dec(const void **_pp, void *value);
static herr_t H5P__facc_libver_type_enc(const void *value, void **_pp, size_t *size);
static herr_t H5P__facc_libver_type_dec(const void **_pp, void *value);
/* Metadata cache log location property callbacks */
static herr_t H5P_facc_mdc_log_location_enc(const void *value, void **_pp, size_t *size);
static herr_t H5P_facc_mdc_log_location_enc(const void *value, void **_pp, size_t *size, void *udata);
static herr_t H5P_facc_mdc_log_location_dec(const void **_pp, void *value);
static herr_t H5P_facc_mdc_log_location_del(hid_t prop_id, const char *name, size_t size, void *value);
static herr_t H5P_facc_mdc_log_location_copy(const char *name, size_t size, void *value);
@ -317,7 +317,7 @@ static herr_t H5P_facc_mdc_log_location_close(const char *name, size_t size, voi
/* Metadata cache image property callbacks */
static int H5P__facc_cache_image_config_cmp(const void *_config1, const void *_config2, size_t H5_ATTR_UNUSED size);
static herr_t H5P__facc_cache_image_config_enc(const void *value, void **_pp, size_t *size);
static herr_t H5P__facc_cache_image_config_enc(const void *value, void **_pp, size_t *size, void *udata);
static herr_t H5P__facc_cache_image_config_dec(const void **_pp, void *_value);
@ -3019,7 +3019,7 @@ done:
*-------------------------------------------------------------------------
*/
static herr_t
H5P__facc_cache_image_config_enc(const void *value, void **_pp, size_t *size)
H5P__facc_cache_image_config_enc(const void *value, void **_pp, size_t *size, void H5_ATTR_UNUSED *udata)
{
const H5AC_cache_image_config_t *config = (const H5AC_cache_image_config_t *)value; /* Create local aliases for value */
uint8_t **pp = (uint8_t **)_pp;
@ -3445,7 +3445,7 @@ done:
*-------------------------------------------------------------------------
*/
static herr_t
H5P__facc_cache_config_enc(const void *value, void **_pp, size_t *size)
H5P__facc_cache_config_enc(const void *value, void **_pp, size_t *size, void H5_ATTR_UNUSED *udata)
{
const H5AC_cache_config_t *config = (const H5AC_cache_config_t *)value; /* Create local aliases for values */
uint8_t **pp = (uint8_t **)_pp;
@ -3725,7 +3725,7 @@ done:
*-------------------------------------------------------------------------
*/
static herr_t
H5P__facc_fclose_degree_enc(const void *value, void **_pp, size_t *size)
H5P__facc_fclose_degree_enc(const void *value, void **_pp, size_t *size, void H5_ATTR_UNUSED *udata)
{
const H5F_close_degree_t *fclose_degree = (const H5F_close_degree_t *)value; /* Create local alias for values */
uint8_t **pp = (uint8_t **)_pp;
@ -3798,7 +3798,7 @@ H5P__facc_fclose_degree_dec(const void **_pp, void *_value)
*-------------------------------------------------------------------------
*/
static herr_t
H5P__facc_multi_type_enc(const void *value, void **_pp, size_t *size)
H5P__facc_multi_type_enc(const void *value, void **_pp, size_t *size, void H5_ATTR_UNUSED *udata)
{
const H5FD_mem_t *type = (const H5FD_mem_t *)value; /* Create local alias for values */
uint8_t **pp = (uint8_t **)_pp;
@ -4298,7 +4298,7 @@ done:
*-------------------------------------------------------------------------
*/
static herr_t
H5P_facc_mdc_log_location_enc(const void *value, void **_pp, size_t *size)
H5P_facc_mdc_log_location_enc(const void *value, void **_pp, size_t *size, void H5_ATTR_UNUSED *udata)
{
const char *log_location = *(const char * const *)value;
uint8_t **pp = (uint8_t **)_pp;
@ -4598,7 +4598,7 @@ done:
*-------------------------------------------------------------------------
*/
herr_t
H5P__encode_coll_md_read_flag_t(const void *value, void **_pp, size_t *size)
H5P__encode_coll_md_read_flag_t(const void *value, void **_pp, size_t *size, void H5_ATTR_UNUSED *udata)
{
const H5P_coll_md_read_flag_t *coll_md_read_flag = (const H5P_coll_md_read_flag_t *)value;
uint8_t **pp = (uint8_t **)_pp;

View File

@ -132,13 +132,13 @@
static herr_t H5P_fcrt_reg_prop(H5P_genclass_t *pclass);
/* property callbacks */
static herr_t H5P__fcrt_btree_rank_enc(const void *value, void **_pp, size_t *size);
static herr_t H5P__fcrt_btree_rank_enc(const void *value, void **_pp, size_t *size, void *udata);
static herr_t H5P__fcrt_btree_rank_dec(const void **_pp, void *value);
static herr_t H5P__fcrt_shmsg_index_types_enc(const void *value, void **_pp, size_t *size);
static herr_t H5P__fcrt_shmsg_index_types_enc(const void *value, void **_pp, size_t *size, void *udata);
static herr_t H5P__fcrt_shmsg_index_types_dec(const void **_pp, void *value);
static herr_t H5P__fcrt_shmsg_index_minsize_enc(const void *value, void **_pp, size_t *size);
static herr_t H5P__fcrt_shmsg_index_minsize_enc(const void *value, void **_pp, size_t *size, void *udata);
static herr_t H5P__fcrt_shmsg_index_minsize_dec(const void **_pp, void *value);
static herr_t H5P__fcrt_fspace_strategy_enc(const void *value, void **_pp, size_t *size);
static herr_t H5P__fcrt_fspace_strategy_enc(const void *value, void **_pp, size_t *size, void *udata);
static herr_t H5P__fcrt_fspace_strategy_dec(const void **_pp, void *_value);
@ -722,7 +722,7 @@ done:
*-------------------------------------------------------------------------
*/
static herr_t
H5P__fcrt_btree_rank_enc(const void *value, void **_pp, size_t *size)
H5P__fcrt_btree_rank_enc(const void *value, void **_pp, size_t *size, void H5_ATTR_UNUSED *udata)
{
const unsigned *btree_k = (const unsigned *)value; /* Create local alias for values */
uint8_t **pp = (uint8_t **)_pp;
@ -1013,7 +1013,7 @@ done:
*-------------------------------------------------------------------------
*/
static herr_t
H5P__fcrt_shmsg_index_types_enc(const void *value, void **_pp, size_t *size)
H5P__fcrt_shmsg_index_types_enc(const void *value, void **_pp, size_t *size, void H5_ATTR_UNUSED *udata)
{
const unsigned *type_flags = (const unsigned *)value; /* Create local alias for values */
uint8_t **pp = (uint8_t **)_pp;
@ -1106,7 +1106,7 @@ done:
*-------------------------------------------------------------------------
*/
static herr_t
H5P__fcrt_shmsg_index_minsize_enc(const void *value, void **_pp, size_t *size)
H5P__fcrt_shmsg_index_minsize_enc(const void *value, void **_pp, size_t *size, void H5_ATTR_UNUSED *udata)
{
const unsigned *minsizes = (const unsigned *)value; /* Create local alias for values */
uint8_t **pp = (uint8_t **)_pp;
@ -1388,7 +1388,7 @@ done:
*-------------------------------------------------------------------------
*/
static herr_t
H5P__fcrt_fspace_strategy_enc(const void *value, void **_pp, size_t *size)
H5P__fcrt_fspace_strategy_enc(const void *value, void **_pp, size_t *size, void H5_ATTR_UNUSED *udata)
{
const H5F_fspace_strategy_t *strategy = (const H5F_fspace_strategy_t *)value; /* Create local alias for values */
uint8_t **pp = (uint8_t **)_pp;

View File

@ -69,9 +69,9 @@
static herr_t H5P__gcrt_reg_prop(H5P_genclass_t *pclass);
/* Property callbacks */
static herr_t H5P__gcrt_group_info_enc(const void *value, void **_pp, size_t *size);
static herr_t H5P__gcrt_group_info_enc(const void *value, void **_pp, size_t *size, void *udata);
static herr_t H5P__gcrt_group_info_dec(const void **_pp, void *value);
static herr_t H5P__gcrt_link_info_enc(const void *value, void **_pp, size_t *size);
static herr_t H5P__gcrt_link_info_enc(const void *value, void **_pp, size_t *size, void *udata);
static herr_t H5P__gcrt_link_info_dec(const void **_pp, void *value);
@ -546,7 +546,7 @@ done:
*-------------------------------------------------------------------------
*/
static herr_t
H5P__gcrt_group_info_enc(const void *value, void **_pp, size_t *size)
H5P__gcrt_group_info_enc(const void *value, void **_pp, size_t *size, void H5_ATTR_UNUSED *udata)
{
const H5O_ginfo_t *ginfo = (const H5O_ginfo_t *)value; /* Create local aliases for values */
uint8_t **pp = (uint8_t **)_pp;
@ -634,7 +634,7 @@ H5P__gcrt_group_info_dec(const void **_pp, void *_value)
*-------------------------------------------------------------------------
*/
static herr_t
H5P__gcrt_link_info_enc(const void *value, void **_pp, size_t *size)
H5P__gcrt_link_info_enc(const void *value, void **_pp, size_t *size, void H5_ATTR_UNUSED *udata)
{
const H5O_linfo_t *linfo = (const H5O_linfo_t *)value; /* Create local aliases for values */
uint8_t **pp = (uint8_t **)_pp;

View File

@ -114,7 +114,7 @@ static herr_t H5P__lacc_reg_prop(H5P_genclass_t *pclass);
/* Property list callbacks */
static herr_t H5P__lacc_elink_pref_set(hid_t prop_id, const char* name, size_t size, void* value);
static herr_t H5P__lacc_elink_pref_get(hid_t prop_id, const char* name, size_t size, void* value);
static herr_t H5P__lacc_elink_pref_enc(const void *value, void **_pp, size_t *size);
static herr_t H5P__lacc_elink_pref_enc(const void *value, void **_pp, size_t *size, void *udata);
static herr_t H5P__lacc_elink_pref_dec(const void **_pp, void *value);
static herr_t H5P__lacc_elink_pref_del(hid_t prop_id, const char* name, size_t size, void* value);
static herr_t H5P__lacc_elink_pref_copy(const char* name, size_t size, void* value);
@ -122,7 +122,7 @@ static int H5P__lacc_elink_pref_cmp(const void *value1, const void *value2, size
static herr_t H5P__lacc_elink_pref_close(const char* name, size_t size, void* value);
static herr_t H5P__lacc_elink_fapl_set(hid_t prop_id, const char* name, size_t size, void* value);
static herr_t H5P__lacc_elink_fapl_get(hid_t prop_id, const char* name, size_t size, void* value);
static herr_t H5P__lacc_elink_fapl_enc(const void *value, void **_pp, size_t *size);
static herr_t H5P__lacc_elink_fapl_enc(const void *value, void **_pp, size_t *size, void *udata);
static herr_t H5P__lacc_elink_fapl_dec(const void **_pp, void *value);
static herr_t H5P__lacc_elink_fapl_del(hid_t prop_id, const char* name, size_t size, void* value);
static herr_t H5P__lacc_elink_fapl_copy(const char* name, size_t size, void* value);
@ -338,13 +338,14 @@ done:
*-------------------------------------------------------------------------
*/
static herr_t
H5P__lacc_elink_fapl_enc(const void *value, void **_pp, size_t *size)
H5P__lacc_elink_fapl_enc(const void *value, void **_pp, size_t *size, void *_udata)
{
const hid_t *elink_fapl = (const hid_t *)value; /* Property to encode */
const hid_t *elink_fapl = (const hid_t *)value; /* Property to encode */
uint8_t **pp = (uint8_t **)_pp;
H5P_enc_cb_info_t *udata = (H5P_enc_cb_info_t *)_udata; /* User data for encode callback */
H5P_genplist_t *fapl_plist; /* Pointer to property list */
hbool_t non_default_fapl = FALSE; /* Whether the FAPL is non-default */
size_t fapl_size = 0; /* FAPL's encoded size */
size_t fapl_size = 0; /* FAPL's encoded size */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_STATIC
@ -364,7 +365,7 @@ H5P__lacc_elink_fapl_enc(const void *value, void **_pp, size_t *size)
/* Encode the property list, if non-default */
/* (if *pp == NULL, will only compute the size) */
if(non_default_fapl) {
if(H5P__encode(fapl_plist, TRUE, NULL, &fapl_size) < 0)
if(H5P__encode(fapl_plist, TRUE, NULL, &fapl_size, udata->fapl_id) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTENCODE, FAIL, "can't encode property list")
if(*pp) {
@ -379,7 +380,7 @@ H5P__lacc_elink_fapl_enc(const void *value, void **_pp, size_t *size)
UINT64ENCODE_VAR(*pp, enc_value, enc_size);
/* encode the plist */
if(H5P__encode(fapl_plist, TRUE, *pp, &fapl_size) < 0)
if(H5P__encode(fapl_plist, TRUE, *pp, &fapl_size, udata->fapl_id) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTENCODE, FAIL, "can't encode property list")
*pp += fapl_size;
@ -688,7 +689,7 @@ H5P__lacc_elink_pref_get(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED
*-------------------------------------------------------------------------
*/
static herr_t
H5P__lacc_elink_pref_enc(const void *value, void **_pp, size_t *size)
H5P__lacc_elink_pref_enc(const void *value, void **_pp, size_t *size, void H5_ATTR_UNUSED *udata)
{
const char *elink_pref = *(const char * const *)value;
uint8_t **pp = (uint8_t **)_pp;

View File

@ -90,7 +90,7 @@
static herr_t H5P__ocrt_reg_prop(H5P_genclass_t *pclass);
/* Property callbacks */
static herr_t H5P__ocrt_pipeline_enc(const void *value, void **_pp, size_t *size);
static herr_t H5P__ocrt_pipeline_enc(const void *value, void **_pp, size_t *size, void *udata);
static herr_t H5P__ocrt_pipeline_dec(const void **_pp, void *value);
static herr_t H5P__ocrt_pipeline_set(hid_t prop_id, const char *name, size_t size, void *value);
static herr_t H5P__ocrt_pipeline_get(hid_t prop_id, const char *name, size_t size, void *value);
@ -1459,7 +1459,7 @@ done:
*-------------------------------------------------------------------------
*/
static herr_t
H5P__ocrt_pipeline_enc(const void *value, void **_pp, size_t *size)
H5P__ocrt_pipeline_enc(const void *value, void **_pp, size_t *size, void H5_ATTR_UNUSED *udata)
{
const H5O_pline_t *pline = (const H5O_pline_t *)value;
uint8_t **pp = (uint8_t **)_pp;

View File

@ -176,21 +176,21 @@ H5_DLL hid_t H5P__new_plist_of_type(H5P_plist_type_t type);
/* Encode/decode routines */
H5_DLL herr_t H5P__encode(const H5P_genplist_t *plist, hbool_t enc_all_prop,
void *buf, size_t *nalloc);
void *buf, size_t *nalloc, hid_t fapl_id);
H5_DLL hid_t H5P__decode(const void *buf);
H5_DLL herr_t H5P__encode_hsize_t(const void *value, void **_pp, size_t *size);
H5_DLL herr_t H5P__encode_size_t(const void *value, void **_pp, size_t *size);
H5_DLL herr_t H5P__encode_unsigned(const void *value, void **_pp, size_t *size);
H5_DLL herr_t H5P__encode_uint8_t(const void *value, void **_pp, size_t *size);
H5_DLL herr_t H5P__encode_hbool_t(const void *value, void **_pp, size_t *size);
H5_DLL herr_t H5P__encode_double(const void *value, void **_pp, size_t *size);
H5_DLL herr_t H5P__encode_hsize_t(const void *value, void **_pp, size_t *size, void *udata);
H5_DLL herr_t H5P__encode_size_t(const void *value, void **_pp, size_t *size, void *udata);
H5_DLL herr_t H5P__encode_unsigned(const void *value, void **_pp, size_t *size, void *udata);
H5_DLL herr_t H5P__encode_uint8_t(const void *value, void **_pp, size_t *size, void *udata);
H5_DLL herr_t H5P__encode_hbool_t(const void *value, void **_pp, size_t *size, void *udata);
H5_DLL herr_t H5P__encode_double(const void *value, void **_pp, size_t *size, void *udat);
H5_DLL herr_t H5P__decode_hsize_t(const void **_pp, void *value);
H5_DLL herr_t H5P__decode_size_t(const void **_pp, void *value);
H5_DLL herr_t H5P__decode_unsigned(const void **_pp, void *value);
H5_DLL herr_t H5P__decode_uint8_t(const void **_pp, void *value);
H5_DLL herr_t H5P__decode_hbool_t(const void **_pp, void *value);
H5_DLL herr_t H5P__decode_double(const void **_pp, void *value);
H5_DLL herr_t H5P__encode_coll_md_read_flag_t(const void *value, void **_pp, size_t *size);
H5_DLL herr_t H5P__encode_coll_md_read_flag_t(const void *value, void **_pp, size_t *size, void *udata);
H5_DLL herr_t H5P__decode_coll_md_read_flag_t(const void **_pp, void *value);
/* Private OCPL routines */

View File

@ -84,6 +84,16 @@ typedef enum H5P_plist_type_t {
/* Function pointer for library classes with properties to register */
typedef herr_t (*H5P_reg_prop_func_t)(H5P_genclass_t *pclass);
/* Move encode/decode callback typedefs from H5Ppublic.h: not exposed to user */
/* Add a parameter to encode callback */
typedef herr_t (*H5P_prp_encode_func_t)(const void *value, void **buf, size_t *size, void *udata);
typedef herr_t (*H5P_prp_decode_func_t)(const void **buf, void *value);
/* User data passed to encode callback */
typedef struct H5P_enc_cb_info_t {
hid_t fapl_id; /* File access property list */
} H5P_enc_cb_info_t;
/*
* Each library property list class has a variable of this type that contains
* class variables and methods used to initialize the class.

View File

@ -116,8 +116,6 @@ typedef herr_t (*H5P_prp_cb2_t)(hid_t prop_id, const char *name, size_t size, vo
typedef H5P_prp_cb1_t H5P_prp_create_func_t;
typedef H5P_prp_cb2_t H5P_prp_set_func_t;
typedef H5P_prp_cb2_t H5P_prp_get_func_t;
typedef herr_t (*H5P_prp_encode_func_t)(const void *value, void **buf, size_t *size);
typedef herr_t (*H5P_prp_decode_func_t)(const void **buf, void *value);
typedef H5P_prp_cb2_t H5P_prp_delete_func_t;
typedef H5P_prp_cb1_t H5P_prp_copy_func_t;
typedef int (*H5P_prp_compare_func_t)(const void *value1, const void *value2, size_t size);

View File

@ -69,7 +69,7 @@
static herr_t H5P__strcrt_reg_prop(H5P_genclass_t *pclass);
/* encode & decode callbacks */
static herr_t H5P__strcrt_char_encoding_enc(const void *value, void **_pp, size_t *size);
static herr_t H5P__strcrt_char_encoding_enc(const void *value, void **_pp, size_t *size, void *udata);
static herr_t H5P__strcrt_char_encoding_dec(const void **_pp, void *value);
@ -227,7 +227,7 @@ done:
*-------------------------------------------------------------------------
*/
static herr_t
H5P__strcrt_char_encoding_enc(const void *value, void **_pp, size_t *size)
H5P__strcrt_char_encoding_enc(const void *value, void **_pp, size_t *size, void H5_ATTR_UNUSED *udata)
{
const H5T_cset_t *encoding = (const H5T_cset_t *)value; /* Create local alias for values */
uint8_t **pp = (uint8_t **)_pp;

View File

@ -290,7 +290,7 @@ H5R__create(void *_ref, H5G_loc_t *loc, const char *name, H5R_type_t ref_type,
HDmemset(ref, 0, H5R_DSET_REG_REF_BUF_SIZE);
/* Get the amount of space required to serialize the selection */
if ((buf_size = H5S_SELECT_SERIAL_SIZE(space)) < 0)
if ((buf_size = H5S_SELECT_SERIAL_SIZE(space, loc->oloc->file)) < 0)
HGOTO_ERROR(H5E_REFERENCE, H5E_CANTINIT, FAIL, "Invalid amount of space for serializing selection")
/* Increase buffer size to allow for the dataset OID */
@ -306,7 +306,7 @@ H5R__create(void *_ref, H5G_loc_t *loc, const char *name, H5R_type_t ref_type,
H5F_addr_encode(loc->oloc->file, &p, obj_loc.oloc->addr);
/* Serialize the selection into heap buffer */
if (H5S_SELECT_SERIALIZE(space, &p) < 0)
if (H5S_SELECT_SERIALIZE(space, &p, loc->oloc->file) < 0)
HGOTO_ERROR(H5E_REFERENCE, H5E_CANTCOPY, FAIL, "Unable to serialize selection")
/* Save the serialized buffer for later */

View File

@ -1604,7 +1604,7 @@ H5Sencode(hid_t obj_id, void *buf, size_t *nalloc)
if (NULL == (dspace = (H5S_t *)H5I_object_verify(obj_id, H5I_DATASPACE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace")
if(H5S_encode(dspace, (unsigned char **)&buf, nalloc)<0)
if(H5S_encode(dspace, (unsigned char **)&buf, nalloc, H5P_FILE_ACCESS_DEFAULT)<0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTENCODE, FAIL, "can't encode dataspace")
done:
@ -1629,7 +1629,7 @@ done:
*-------------------------------------------------------------------------
*/
herr_t
H5S_encode(H5S_t *obj, unsigned char **p, size_t *nalloc)
H5S_encode(H5S_t *obj, unsigned char **p, size_t *nalloc, hid_t fapl_id)
{
H5F_t *f = NULL; /* Fake file structure*/
size_t extent_size; /* Size of serialized dataspace extent */
@ -1640,7 +1640,7 @@ H5S_encode(H5S_t *obj, unsigned char **p, size_t *nalloc)
FUNC_ENTER_NOAPI_NOINIT
/* Allocate "fake" file structure */
if(NULL == (f = H5F_fake_alloc((uint8_t)0)))
if(NULL == (f = H5F_fake_alloc((uint8_t)0, fapl_id)))
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, FAIL, "can't allocate fake file struct")
/* Find out the size of buffer needed for extent */
@ -1648,7 +1648,7 @@ H5S_encode(H5S_t *obj, unsigned char **p, size_t *nalloc)
HGOTO_ERROR(H5E_DATASPACE, H5E_BADSIZE, FAIL, "can't find dataspace size")
/* Find out the size of buffer needed for selection */
if((sselect_size = H5S_SELECT_SERIAL_SIZE(obj)) < 0)
if((sselect_size = H5S_SELECT_SERIAL_SIZE(obj, f)) < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_BADSIZE, FAIL, "can't find dataspace selection size")
H5_CHECKED_ASSIGN(select_size, size_t, sselect_size, hssize_t);
@ -1678,7 +1678,7 @@ H5S_encode(H5S_t *obj, unsigned char **p, size_t *nalloc)
/* Encode the selection part of dataspace. */
*p = pp;
if(H5S_SELECT_SERIALIZE(obj, p) < 0)
if(H5S_SELECT_SERIALIZE(obj, p, f) < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTENCODE, FAIL, "can't encode select space")
} /* end else */
@ -1772,8 +1772,8 @@ H5S_decode(const unsigned char **p)
sizeof_size = *pp++;
/* Allocate "fake" file structure */
if(NULL == (f = H5F_fake_alloc(sizeof_size)))
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, NULL, "can't allocate fake file struct")
if(NULL == (f = H5F_fake_alloc(sizeof_size, H5P_FILE_ACCESS_DEFAULT)))
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, NULL, "can't allocate fake file struct")
/* Decode size of extent information */
UINT32DECODE(pp, extent_size);

View File

@ -36,8 +36,8 @@ static herr_t H5S__all_get_seq_list(const H5S_t *space, unsigned flags,
size_t *nseq, size_t *nbytes, hsize_t *off, size_t *len);
static herr_t H5S__all_release(H5S_t *space);
static htri_t H5S__all_is_valid(const H5S_t *space);
static hssize_t H5S__all_serial_size(const H5S_t *space);
static herr_t H5S__all_serialize(const H5S_t *space, uint8_t **p);
static hssize_t H5S__all_serial_size(const H5S_t *space, H5F_t *f);
static herr_t H5S__all_serialize(const H5S_t *space, uint8_t **p, H5F_t *f);
static herr_t H5S__all_deserialize(H5S_t *space, uint32_t version, uint8_t flags,
const uint8_t **p);
static herr_t H5S__all_bounds(const H5S_t *space, hsize_t *start, hsize_t *end);
@ -56,7 +56,7 @@ static herr_t H5S__all_iter_coords(const H5S_sel_iter_t *iter, hsize_t *coords);
static herr_t H5S__all_iter_block(const H5S_sel_iter_t *iter, hsize_t *start, hsize_t *end);
static hsize_t H5S__all_iter_nelmts(const H5S_sel_iter_t *iter);
static htri_t H5S__all_iter_has_next_block(const H5S_sel_iter_t *iter);
static herr_t H5S__all_iter_next(H5S_sel_iter_t *sel_iter, size_t nelem);
static herr_t H5S__all_iter_next(H5S_sel_iter_t *sel_iter, hsize_t nelem);
static herr_t H5S__all_iter_next_block(H5S_sel_iter_t *sel_iter);
static herr_t H5S__all_iter_release(H5S_sel_iter_t *sel_iter);
@ -268,7 +268,7 @@ H5S__all_iter_has_next_block(const H5S_sel_iter_t H5_ATTR_UNUSED *iter)
USAGE
herr_t H5S__all_iter_next(iter, nelem)
H5S_sel_iter_t *iter; IN: Pointer to selection iterator
size_t nelem; IN: Number of elements to advance by
hsize_t nelem; IN: Number of elements to advance by
RETURNS
Non-negative on success/Negative on failure
DESCRIPTION
@ -279,7 +279,7 @@ H5S__all_iter_has_next_block(const H5S_sel_iter_t H5_ATTR_UNUSED *iter)
REVISION LOG
--------------------------------------------------------------------------*/
static herr_t
H5S__all_iter_next(H5S_sel_iter_t *iter, size_t nelem)
H5S__all_iter_next(H5S_sel_iter_t *iter, hsize_t nelem)
{
FUNC_ENTER_STATIC_NOERR
@ -457,8 +457,9 @@ H5S__all_is_valid(const H5S_t H5_ATTR_UNUSED *space)
Determine the number of bytes needed to store the serialized "all"
selection information.
USAGE
hssize_t H5S__all_serial_size(space)
hssize_t H5S_all_serial_size(space, f)
H5S_t *space; IN: Dataspace pointer to query
H5F_t *f; IN: File pointer
RETURNS
The number of bytes required on success, negative on an error.
DESCRIPTION
@ -470,7 +471,7 @@ H5S__all_is_valid(const H5S_t H5_ATTR_UNUSED *space)
REVISION LOG
--------------------------------------------------------------------------*/
static hssize_t
H5S__all_serial_size(const H5S_t H5_ATTR_UNUSED *space)
H5S__all_serial_size (const H5S_t H5_ATTR_UNUSED *space, H5F_t H5_ATTR_UNUSED *f)
{
FUNC_ENTER_STATIC_NOERR
@ -490,11 +491,12 @@ H5S__all_serial_size(const H5S_t H5_ATTR_UNUSED *space)
PURPOSE
Serialize the current selection into a user-provided buffer.
USAGE
herr_t H5S_all_serialize(space, p)
herr_t H5S__all_serialize(space, p, f)
const H5S_t *space; IN: Dataspace with selection to serialize
uint8_t **p; OUT: Pointer to buffer to put serialized
selection. Will be advanced to end of
serialized selection.
H5F_t *f; IN: File pointer
RETURNS
Non-negative on success/Negative on failure
DESCRIPTION
@ -506,7 +508,7 @@ H5S__all_serial_size(const H5S_t H5_ATTR_UNUSED *space)
REVISION LOG
--------------------------------------------------------------------------*/
static herr_t
H5S__all_serialize(const H5S_t *space, uint8_t **p)
H5S__all_serialize(const H5S_t *space, uint8_t **p, H5F_t H5_ATTR_UNUSED *f)
{
uint8_t *pp = (*p); /* Local pointer for decoding */
@ -518,8 +520,8 @@ H5S__all_serialize(const H5S_t *space, uint8_t **p)
HDassert(pp);
/* Store the preamble information */
UINT32ENCODE(pp, (uint32_t)H5S_GET_SELECT_TYPE(space)); /* Store the type of selection */
UINT32ENCODE(pp, (uint32_t)1); /* Store the version number */
UINT32ENCODE(pp, (uint32_t)H5S_GET_SELECT_TYPE(space)); /* Store the type of selection */
UINT32ENCODE(pp, (uint32_t)H5S_ALL_VERSION_1); /* Store the version number */
UINT32ENCODE(pp, (uint32_t)0); /* Store the un-used padding */
UINT32ENCODE(pp, (uint32_t)0); /* Store the additional information length */

View File

@ -28,7 +28,12 @@
#include "H5Spkg.h" /* Dataspace functions */
#include "H5VMprivate.h" /* Vector functions */
/* Local Macros */
/* Format version bounds for dataspace hyperslab selection */
const unsigned H5O_sds_hyper_ver_bounds[] = {
H5S_HYPER_VERSION_1, /* H5F_LIBVER_EARLIEST */
H5S_HYPER_VERSION_1, /* H5F_LIBVER_V18 */
H5S_HYPER_VERSION_2 /* H5F_LIBVER_LATEST */
};
/* Local datatypes */
@ -80,8 +85,8 @@ static herr_t H5S__hyper_get_seq_list(const H5S_t *space, unsigned flags,
size_t *nseq, size_t *nbytes, hsize_t *off, size_t *len);
static herr_t H5S__hyper_release(H5S_t *space);
static htri_t H5S__hyper_is_valid(const H5S_t *space);
static hssize_t H5S__hyper_serial_size(const H5S_t *space);
static herr_t H5S__hyper_serialize(const H5S_t *space, uint8_t **p);
static hssize_t H5S__hyper_serial_size(const H5S_t *space, H5F_t *f);
static herr_t H5S__hyper_serialize(const H5S_t *space, uint8_t **p, H5F_t *f);
static herr_t H5S__hyper_deserialize(H5S_t *space, uint32_t version, uint8_t flags,
const uint8_t **p);
static herr_t H5S__hyper_bounds(const H5S_t *space, hsize_t *start, hsize_t *end);
@ -102,10 +107,9 @@ static herr_t H5S__hyper_iter_coords(const H5S_sel_iter_t *iter, hsize_t *coords
static herr_t H5S__hyper_iter_block(const H5S_sel_iter_t *iter, hsize_t *start, hsize_t *end);
static hsize_t H5S__hyper_iter_nelmts(const H5S_sel_iter_t *iter);
static htri_t H5S__hyper_iter_has_next_block(const H5S_sel_iter_t *sel_iter);
static herr_t H5S__hyper_iter_next(H5S_sel_iter_t *sel_iter, size_t nelem);
static herr_t H5S__hyper_iter_next(H5S_sel_iter_t *sel_iter, hsize_t nelem);
static herr_t H5S__hyper_iter_next_block(H5S_sel_iter_t *sel_iter);
static herr_t H5S__hyper_iter_release(H5S_sel_iter_t *sel_iter);
/* Static function for optimizing hyperslab */
static hbool_t H5S__hyper_rebuild_helper(const H5S_hyper_span_t *span,
H5S_hyper_dim_t span_slab_info[], unsigned rank);
@ -684,7 +688,7 @@ done:
*-------------------------------------------------------------------------
*/
static herr_t
H5S__hyper_iter_next(H5S_sel_iter_t *iter, size_t nelem)
H5S__hyper_iter_next(H5S_sel_iter_t *iter, hsize_t nelem)
{
unsigned ndims; /* Number of dimensions of dataset */
int fast_dim; /* Rank of the fastest changing dimension for the dataspace */
@ -731,17 +735,17 @@ H5S__hyper_iter_next(H5S_sel_iter_t *iter, size_t nelem)
/* Loop through, advancing the offset & counts, until all the nelements are accounted for */
while(nelem > 0) {
/* Start with the fastest changing dimension */
temp_dim = fast_dim;
while(temp_dim >= 0) {
if(temp_dim == fast_dim) {
size_t actual_elem; /* Actual # of elements advanced on each iteration through loop */
temp_dim=fast_dim;
while(temp_dim>=0) {
if(temp_dim==fast_dim) {
hsize_t actual_elem; /* Actual # of elements advanced on each iteration through loop */
hsize_t block_elem; /* Number of elements left in a block */
/* Compute the number of elements left in block */
block_elem = tdiminfo[temp_dim].block - iter_offset[temp_dim];
/* Compute the number of actual elements to advance */
actual_elem = (size_t)MIN(nelem, block_elem);
actual_elem=MIN(nelem,block_elem);
/* Move the iterator over as many elements as possible */
iter_offset[temp_dim] += actual_elem;
@ -804,8 +808,8 @@ H5S__hyper_iter_next(H5S_sel_iter_t *iter, size_t nelem)
curr_span = ispan[curr_dim];
/* Increment absolute position */
if(curr_dim == fast_dim) {
size_t actual_elem; /* Actual # of elements advanced on each iteration through loop */
if(curr_dim==fast_dim) {
hsize_t actual_elem; /* Actual # of elements advanced on each iteration through loop */
hsize_t span_elem; /* Number of elements left in a span */
/* Compute the number of elements left in block */
@ -1944,6 +1948,132 @@ done:
FUNC_LEAVE_API(ret_value)
} /* end H5Sget_select_hyper_nblocks() */
/*--------------------------------------------------------------------------
NAME
H5S_hyper_set_offset_size
PURPOSE
Determine the offset size (4 or 8 bytes) to use for encoding hyperslab selection info
USAGE
hssize_t H5S_hyper_set_offset_size(space, block_count, bounds_end, version, offset_size)
const H5S_t *space: IN: The maximum size of the hyperslab selection info
hsize_t block_count: IN: The number of blocks in the selection
hsize_t bounds_end: IN: The selection high bounds
uint32_t version: IN: The version used for encoding
uint8_t *offset_size: OUT: The offset size
RETURNS
The offset size
DESCRIPTION
Determine the offset size for encoding hyperslab selection info based on the
the input parameter "version". This is for release 1.10.
GLOBAL VARIABLES
COMMENTS, BUGS, ASSUMPTIONS
EXAMPLES
REVISION LOG
--------------------------------------------------------------------------*/
static herr_t
H5S_hyper_set_offset_size(const H5S_t *space, hsize_t block_count, hsize_t bounds_end[], uint32_t version, uint8_t *offset_size)
{
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI_NOINIT
switch(version) {
case H5S_HYPER_VERSION_1:
*offset_size = H5S_INFO_SIZE_4;
break;
case H5S_HYPER_VERSION_2:
*offset_size = H5S_INFO_SIZE_8;
break;
default:
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTGET, FAIL, "can't determine hyper offset size")
break;
}
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* H5S_hyper_set_offset_size() */
/*--------------------------------------------------------------------------
NAME
H5S_hyper_set_version
PURPOSE
Determine the version to use for encoding hyperslab selection info
See tables 2 & 3 in the RFC: H5Sencode/H5Sdecode Format Change
USAGE
hssize_t H5S_hyper_set_version(space, block_count, bounds_end, f, version)
const H5S_t *space: IN: The dataspace
hsize_t block_count: IN: The number of blocks in the selection
hsize_t bounds_end: IN: The selection high bounds
H5F_t *f: IN: The file pointer
uint32_t *version: OUT: The version to use for encoding
RETURNS
The version to use
DESCRIPTION
Determine the version to use for encoding hyperslab selection info based
on whether the number of blocks or the selection high bounds exceeds (2^32 - 1).
GLOBAL VARIABLES
COMMENTS, BUGS, ASSUMPTIONS
EXAMPLES
REVISION LOG
--------------------------------------------------------------------------*/
static herr_t
H5S_hyper_set_version(const H5S_t *space, hsize_t block_count, hsize_t bounds_end[], H5F_t *f, uint32_t *version)
{
hbool_t count_up_version = FALSE; /* Whether number of blocks exceed (2^32 - 1) */
hbool_t bound_up_version = FALSE; /* Whether high bounds exceed (2^32 - 1) */
unsigned u; /* Local index veriable */
uint32_t tmp_version; /* Temporay version */
herr_t ret_value = SUCCEED; /* return value */
FUNC_ENTER_NOAPI_NOINIT
/* Determine whether the number of blocks or the high bounds in the selection exceed (2^32 - 1) */
if(block_count > H5S_UINT32_MAX)
count_up_version = TRUE;
else {
for(u = 0; u < space->extent.rank; u++)
if(bounds_end[u] > H5S_UINT32_MAX)
bound_up_version = TRUE;
}
/* Use version 2 for unlimited selection */
if(space->select.sel_info.hslab->unlim_dim >= 0)
tmp_version = H5S_HYPER_VERSION_2;
else if(H5S__hyper_is_regular(space)) {
/* If exceed (2^32 -1) */
if(count_up_version || bound_up_version)
tmp_version = H5S_HYPER_VERSION_2;
else
/* block_count < 4: version 1 */
/* block_count >= 4: determined by low bound */
tmp_version = (block_count < 4) ? H5S_HYPER_VERSION_1 : H5O_sds_hyper_ver_bounds[H5F_LOW_BOUND(f)];
} else {
/* Fail for irregular hyperslab if exceeds 32 bits */
if(count_up_version)
HGOTO_ERROR(H5E_DATASPACE, H5E_BADVALUE, FAIL, "The number of blocks in hyperslab selection exceeds 2^32")
else if(bound_up_version)
HGOTO_ERROR(H5E_DATASPACE, H5E_BADVALUE, FAIL, "The end of bounding box in hyperslab selection exceeds 2^32")
tmp_version = H5S_HYPER_VERSION_1;
}
/* Version bounds check */
if(tmp_version > H5O_sds_hyper_ver_bounds[H5F_HIGH_BOUND(f)])
HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, FAIL, "Dataspace hyperslab selection version out of bounds")
*version = tmp_version;
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* H5S_hyper_set_version() */
/*--------------------------------------------------------------------------
NAME
@ -1952,8 +2082,9 @@ done:
Determine the number of bytes needed to store the serialized hyperslab
selection information.
USAGE
hssize_t H5S__hyper_serial_size(space)
hssize_t H5S_hyper_serial_size(space, H5F_t *f)
H5S_t *space; IN: Dataspace pointer to query
H5F_t *f; IN: File pointer
RETURNS
The number of bytes required on success, negative on an error.
DESCRIPTION
@ -1965,39 +2096,25 @@ done:
REVISION LOG
--------------------------------------------------------------------------*/
static hssize_t
H5S__hyper_serial_size(const H5S_t *space)
H5S__hyper_serial_size(const H5S_t *space, H5F_t *f)
{
hsize_t block_count; /* block counter for regular hyperslabs */
unsigned u; /* Counter */
hssize_t ret_value = -1; /* return value */
hsize_t block_count = 0; /* block counter for regular hyperslabs */
hsize_t bounds_start[H5S_MAX_RANK]; /* Selection bounds */
hsize_t bounds_end[H5S_MAX_RANK]; /* Selection bounds */
uint32_t version; /* Version number */
uint8_t offset_size; /* Offset size */
unsigned u; /* Local index variable */
hssize_t ret_value = -1; /* return value */
FUNC_ENTER_STATIC_NOERR
FUNC_ENTER_NOAPI_NOINIT
HDassert(space);
/* Check for version (right now, an unlimited dimension is the only thing
* that would bump the version) */
if(space->select.sel_info.hslab->unlim_dim >= 0)
/* Version 2 */
/* Size required is always:
* <type (4 bytes)> + <version (4 bytes)> + <flags (1 byte)> +
* <length (4 bytes)> + <rank (4 bytes)> +
* (4 (start/stride/count/block) * <rank> * <value (8 bytes)>) =
* 17 + (4 * rank * 8) bytes
*/
ret_value = (hssize_t)17 + ((hssize_t)4 * (hssize_t)space->extent.rank
* (hssize_t)8);
else {
/* Version 1 */
/* Basic number of bytes required to serialize hyperslab selection:
* <type (4 bytes)> + <version (4 bytes)> + <padding (4 bytes)> +
* <length (4 bytes)> + <rank (4 bytes)> + <# of blocks (4 bytes)>
* = 24 bytes
*/
ret_value = 24;
/* Check for a "regular" hyperslab selection */
if(space->select.sel_info.hslab->diminfo_valid) {
/* Get bounding box for the selection */
HDmemset(bounds_end, 0, sizeof(bounds_end));
if(space->select.sel_info.hslab->unlim_dim < 0) { /* ! H5S_UNLIMITED */
/* Determine the number of blocks */
if(H5S__hyper_is_regular(space)) {
/* Check each dimension */
for(block_count = 1, u = 0; u < space->extent.rank; u++)
block_count *= space->select.sel_info.hslab->opt_diminfo[u].count;
@ -2006,10 +2123,45 @@ H5S__hyper_serial_size(const H5S_t *space)
/* Spin through hyperslab spans, adding 8 * rank bytes for each block */
block_count = H5S__hyper_span_nblocks(space->select.sel_info.hslab->span_lst);
/* Get bounding box for the selection */
if(H5S__hyper_bounds(space, bounds_start, bounds_end) < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTGET, FAIL, "can't get selection bounds")
}
/* Determine the version */
if(H5S_hyper_set_version(space, block_count, bounds_end, f, &version) < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTGET, FAIL, "can't determine hyper version")
/* Determine the offset size */
if(H5S_hyper_set_offset_size(space, block_count, bounds_end, version, &offset_size) < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTGET, FAIL, "can't determine hyper version")
if(version == H5S_HYPER_VERSION_2) {
/* Version 2 */
/* Size required is always:
* <type (4 bytes)> + <version (4 bytes)> + <flags (1 byte)> +
* <length (4 bytes)> + <rank (4 bytes)> +
* (4 (start/stride/count/block) * <offset_size (8 bytes)> * <rank>) =
* 17 + (4 * 8 * rank) bytes
*/
HDassert(offset_size == 8);
ret_value = (hssize_t)17 + ((hssize_t)4 * (hssize_t)8 * (hssize_t)space->extent.rank);
} else {
HDassert(version == H5S_HYPER_VERSION_1);
HDassert(offset_size == 4);
/* Version 1 */
/* Basic number of bytes required to serialize hyperslab selection:
* <type (4 bytes)> + <version (4 bytes)> + <padding (4 bytes)> +
* <length (4 bytes)> + <rank (4 bytes)> + <# of blocks (4 bytes)> +
* (2 (starting/ending offset) * <offset_size (4 bytes)> * <rank> * <# of blocks) =
* = 24 bytes + (2 * 4 * rank * block_count)
*/
ret_value = 24;
H5_CHECK_OVERFLOW((8 * space->extent.rank * block_count), hsize_t, hssize_t);
ret_value += (hssize_t)(8 * block_count * space->extent.rank);
ret_value += (hssize_t)(8 * space->extent.rank * block_count);
} /* end else */
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5S__hyper_serial_size() */
@ -2101,11 +2253,12 @@ H5S__hyper_serialize_helper(const H5S_hyper_span_info_t *spans,
PURPOSE
Serialize the current selection into a user-provided buffer.
USAGE
herr_t H5S_hyper_serialize(space, p)
herr_t H5S__hyper_serialize(space, p)
const H5S_t *space; IN: Dataspace with selection to serialize
uint8_t **p; OUT: Pointer to buffer to put serialized
selection. Will be advanced to end of
serialized selection.
H5F_t *f; IN: File pointer
RETURNS
Non-negative on success/Negative on failure
DESCRIPTION
@ -2117,16 +2270,30 @@ H5S__hyper_serialize_helper(const H5S_hyper_span_info_t *spans,
REVISION LOG
--------------------------------------------------------------------------*/
static herr_t
H5S__hyper_serialize(const H5S_t *space, uint8_t **p)
H5S__hyper_serialize(const H5S_t *space, uint8_t **p, H5F_t *f)
{
uint8_t *pp; /* Local pointer for decoding */
uint8_t *lenp; /* Pointer to length location for later storage */
uint32_t len = 0; /* Number of bytes used */
const H5S_hyper_dim_t *diminfo; /* Alias for dataspace's diminfo information */
uint8_t *pp = (*p); /* Local pointer for decoding */
hsize_t tmp_count[H5O_LAYOUT_NDIMS]; /* Temporary hyperslab counts */
hsize_t offset[H5O_LAYOUT_NDIMS]; /* Offset of element in dataspace */
hsize_t start[H5O_LAYOUT_NDIMS]; /* Location of start of hyperslab */
hsize_t end[H5O_LAYOUT_NDIMS]; /* Location of end of hyperslab */
hsize_t temp_off; /* Offset in a given dimension */
uint8_t *lenp; /* pointer to length location for later storage */
uint32_t len = 0; /* number of bytes used */
uint32_t version; /* Version number */
uint8_t flags = 0; /* Flags for message */
hsize_t block_count; /* Block counter for regular hyperslabs */
hsize_t block_count; /* block counter for regular hyperslabs */
unsigned fast_dim; /* Rank of the fastest changing dimension for the dataspace */
unsigned ndims; /* Rank of the dataspace */
unsigned u; /* Local counting variable */
int done; /* Whether we are done with the iteration */
uint8_t offset_size;
hsize_t bounds_start[H5S_MAX_RANK];
hsize_t bounds_end[H5S_MAX_RANK];
herr_t ret_value = SUCCEED; /* return value */
FUNC_ENTER_STATIC_NOERR
FUNC_ENTER_NOAPI_NOINIT
/* Sanity checks */
HDassert(space);
@ -2134,62 +2301,76 @@ H5S__hyper_serialize(const H5S_t *space, uint8_t **p)
pp = (*p);
HDassert(pp);
/* Calculate version */
if(space->select.sel_info.hslab->unlim_dim >= 0) {
version = 2;
flags |= H5S_SELECT_FLAG_UNLIM;
} /* end if */
else
version = 1;
/* Set some convienence values */
ndims = space->extent.rank;
diminfo = space->select.sel_info.hslab->opt_diminfo;
if(space->select.sel_info.hslab->unlim_dim < 0) { /* ! H5S_UNLIMITED */
/* Calculate the # of blocks */
if(H5S__hyper_is_regular(space)) {
/* Check each dimension */
for(block_count = 1, u = 0; u < ndims; u++)
block_count *= diminfo[u].count;
} /* end if */
else
/* Spin through hyperslab spans, adding 8 * rank bytes for each block */
block_count = H5S__hyper_span_nblocks(space->select.sel_info.hslab->span_lst);
/* Get bounding box */
if(H5S__hyper_bounds(space, bounds_start, bounds_end) < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTGET, FAIL, "can't get selection bounds")
}
/* Determine the version to use */
if(H5S_hyper_set_version(space, block_count, bounds_end, f, &version) < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTGET, FAIL, "can't determine hyper version")
/* Determine the size of offset info */
if(H5S_hyper_set_offset_size(space, block_count, bounds_end, version, &offset_size) < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTGET, FAIL, "can't determine hyper version")
if(H5S__hyper_is_regular(space) && version == H5S_HYPER_VERSION_2)
flags |= H5S_HYPER_REGULAR;
/* Store the preamble information */
UINT32ENCODE(pp, (uint32_t)H5S_GET_SELECT_TYPE(space)); /* Store the type of selection */
UINT32ENCODE(pp, version); /* Store the version number */
if(version >= 2)
*(pp)++ = flags; /* Store the flags */
if(version == 2)
*(pp)++ = flags; /* Store the flags */
else
UINT32ENCODE(pp, (uint32_t)0); /* Store the un-used padding */
lenp = pp; /* keep the pointer to the length location for later */
pp += 4; /* skip over space for length */
lenp = pp; /* keep the pointer to the length location for later */
pp += 4; /* skip over space for length */
len += 4; /* ndims */
/* Encode number of dimensions */
UINT32ENCODE(pp, (uint32_t)space->extent.rank);
len += 4;
UINT32ENCODE(pp, (uint32_t)ndims);
/* If there is an unlimited dimension, only encode opt_unlim_diminfo */
if(flags & H5S_SELECT_FLAG_UNLIM) {
/* If flags indicates a regular hyperslab or unlimited dimension, encode opt_diminfo */
if(flags & H5S_HYPER_REGULAR) {
unsigned i;
HDassert(H5S_UNLIMITED == HSIZE_UNDEF);
HDassert(version == H5S_HYPER_VERSION_2);
/* Iterate over dimensions */
/* Encode start/stride/block/count */
for(i = 0; i < space->extent.rank; i++) {
/* Encode start/stride/block/count */
UINT64ENCODE(pp, space->select.sel_info.hslab->opt_diminfo[i].start);
UINT64ENCODE(pp, space->select.sel_info.hslab->opt_diminfo[i].stride);
UINT64ENCODE(pp, space->select.sel_info.hslab->opt_diminfo[i].count);
UINT64ENCODE(pp, space->select.sel_info.hslab->opt_diminfo[i].block);
UINT64ENCODE(pp, diminfo[i].start);
UINT64ENCODE(pp, diminfo[i].stride);
UINT64ENCODE(pp, diminfo[i].count);
UINT64ENCODE(pp, diminfo[i].block);
} /* end for */
len += (4 * space->extent.rank * 8);
} /* end if */
/* Check for a "regular" hyperslab selection */
else if(space->select.sel_info.hslab->diminfo_valid) {
const H5S_hyper_dim_t *diminfo; /* Alias for dataspace's diminfo information */
hsize_t offset[H5O_LAYOUT_NDIMS]; /* Offset of element in dataspace */
hsize_t tmp_count[H5O_LAYOUT_NDIMS]; /* Temporary hyperslab counts */
unsigned fast_dim; /* Rank of the fastest changing dimension for the dataspace */
unsigned ndims; /* Rank of the dataspace */
unsigned u; /* Local counting variable */
hbool_t done; /* Whether we are done with the iteration */
else if(H5S__hyper_is_regular(space)) {
HDassert(version == H5S_HYPER_VERSION_1);
/* Set some convenience values */
ndims = space->extent.rank;
/* Set some convienence values */
fast_dim = ndims - 1;
diminfo = space->select.sel_info.hslab->opt_diminfo;
/* Check each dimension */
for(block_count = 1, u = 0; u < ndims; u++)
block_count *= diminfo[u].count;
/* Encode number of hyperslabs */
H5_CHECK_OVERFLOW(block_count, hsize_t, uint32_t);
UINT32ENCODE(pp, (uint32_t)block_count);
@ -2265,18 +2446,16 @@ H5S__hyper_serialize(const H5S_t *space, uint8_t **p)
} /* end while */
} /* end if */
else {
hsize_t start[H5O_LAYOUT_NDIMS]; /* Location of start of hyperslab */
hsize_t end[H5O_LAYOUT_NDIMS]; /* Location of end of hyperslab */
HDassert(version == H5S_HYPER_VERSION_1);
/* Encode number of hyperslabs */
block_count = H5S__hyper_span_nblocks(space->select.sel_info.hslab->span_lst);
H5_CHECK_OVERFLOW(block_count, hsize_t, uint32_t);
UINT32ENCODE(pp, (uint32_t)block_count);
len += 4;
len+=4; /* block_count */
/* Add 8 bytes times the rank for each hyperslab selected */
H5_CHECK_OVERFLOW((8 * space->extent.rank * block_count), hsize_t, size_t);
len += (uint32_t)(8 * space->extent.rank * block_count);
H5_CHECK_OVERFLOW((8 * ndims * block_count), hsize_t, size_t);
len += (uint32_t)(8 * ndims * block_count);
/* Encode each hyperslab in selection */
H5S__hyper_serialize_helper(space->select.sel_info.hslab->span_lst, start, end, (hsize_t)0, &pp);
@ -2288,8 +2467,9 @@ H5S__hyper_serialize(const H5S_t *space, uint8_t **p)
/* Update encoding pointer */
*p = pp;
FUNC_LEAVE_NOAPI(SUCCEED)
} /* end H5S__hyper_serialize() */
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* H5S_hyper_serialize() */
/*--------------------------------------------------------------------------
@ -2339,8 +2519,7 @@ H5S__hyper_deserialize(H5S_t *space, uint32_t H5_ATTR_UNUSED version, uint8_t fl
/* (The header and rank have already beed decoded) */
rank = space->extent.rank; /* Retrieve rank from space */
/* If there is an unlimited dimension, only encode opt_unlim_diminfo */
if(flags & H5S_SELECT_FLAG_UNLIM) {
if(flags & H5S_HYPER_REGULAR) {
hsize_t stride[H5O_LAYOUT_NDIMS]; /* Hyperslab stride information */
hsize_t count[H5O_LAYOUT_NDIMS]; /* Hyperslab count information */
@ -7473,7 +7652,7 @@ H5S_select_hyperslab (H5S_t *space, H5S_seloper_t op,
HGOTO_ERROR(H5E_DATASPACE, H5E_UNSUPPORTED, FAIL, "unsupported operation with unlimited selection")
/* Get bounds of existing selection */
if(H5S_hyper_bounds(space, bounds_start, bounds_end) < 0)
if(H5S__hyper_bounds(space, bounds_start, bounds_end) < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTGET, FAIL, "can't get selection bounds")
/* Patch count and block to remove unlimited and include the

View File

@ -37,8 +37,8 @@ static herr_t H5S_none_get_seq_list(const H5S_t *space, unsigned flags,
size_t *nseq, size_t *nbytes, hsize_t *off, size_t *len);
static herr_t H5S_none_release(H5S_t *space);
static htri_t H5S_none_is_valid(const H5S_t *space);
static hssize_t H5S_none_serial_size(const H5S_t *space);
static herr_t H5S_none_serialize(const H5S_t *space, uint8_t **p);
static hssize_t H5S_none_serial_size(const H5S_t *space, H5F_t *f);
static herr_t H5S_none_serialize(const H5S_t *space, uint8_t **p, H5F_t *f);
static herr_t H5S_none_deserialize(H5S_t *space, uint32_t version, uint8_t flags,
const uint8_t **p);
static herr_t H5S_none_bounds(const H5S_t *space, hsize_t *start, hsize_t *end);
@ -57,7 +57,7 @@ static herr_t H5S_none_iter_coords(const H5S_sel_iter_t *iter, hsize_t *coords);
static herr_t H5S_none_iter_block(const H5S_sel_iter_t *iter, hsize_t *start, hsize_t *end);
static hsize_t H5S_none_iter_nelmts(const H5S_sel_iter_t *iter);
static htri_t H5S_none_iter_has_next_block(const H5S_sel_iter_t *iter);
static herr_t H5S_none_iter_next(H5S_sel_iter_t *sel_iter, size_t nelem);
static herr_t H5S_none_iter_next(H5S_sel_iter_t *sel_iter, hsize_t nelem);
static herr_t H5S_none_iter_next_block(H5S_sel_iter_t *sel_iter);
static herr_t H5S_none_iter_release(H5S_sel_iter_t *sel_iter);
@ -251,7 +251,7 @@ H5S_none_iter_has_next_block(const H5S_sel_iter_t H5_ATTR_UNUSED *iter)
USAGE
herr_t H5S_none_iter_next(iter, nelem)
H5S_sel_iter_t *iter; IN: Pointer to selection iterator
size_t nelem; IN: Number of elements to advance by
hsize_t nelem; IN: Number of elements to advance by
RETURNS
Non-negative on success/Negative on failure
DESCRIPTION
@ -262,7 +262,7 @@ H5S_none_iter_has_next_block(const H5S_sel_iter_t H5_ATTR_UNUSED *iter)
REVISION LOG
--------------------------------------------------------------------------*/
static herr_t
H5S_none_iter_next(H5S_sel_iter_t H5_ATTR_UNUSED *iter, size_t H5_ATTR_UNUSED nelem)
H5S_none_iter_next(H5S_sel_iter_t H5_ATTR_UNUSED *iter, hsize_t H5_ATTR_UNUSED nelem)
{
FUNC_ENTER_NOAPI_NOINIT_NOERR
@ -433,8 +433,9 @@ H5S_none_is_valid(const H5S_t H5_ATTR_UNUSED *space)
Determine the number of bytes needed to store the serialized "none"
selection information.
USAGE
hssize_t H5S_none_serial_size(space)
hssize_t H5S_none_serial_size(space, f)
H5S_t *space; IN: Dataspace pointer to query
H5F_t *f; IN: File pointer
RETURNS
The number of bytes required on success, negative on an error.
DESCRIPTION
@ -446,7 +447,7 @@ H5S_none_is_valid(const H5S_t H5_ATTR_UNUSED *space)
REVISION LOG
--------------------------------------------------------------------------*/
static hssize_t
H5S_none_serial_size(const H5S_t H5_ATTR_UNUSED *space)
H5S_none_serial_size(const H5S_t H5_ATTR_UNUSED *space, H5F_t H5_ATTR_UNUSED *f)
{
FUNC_ENTER_NOAPI_NOINIT_NOERR
@ -466,11 +467,12 @@ H5S_none_serial_size(const H5S_t H5_ATTR_UNUSED *space)
PURPOSE
Serialize the current selection into a user-provided buffer.
USAGE
herr_t H5S_none_serialize(space, p)
herr_t H5S_none_serialize(space, p, f)
const H5S_t *space; IN: Dataspace with selection to serialize
uint8_t **p; OUT: Pointer to buffer to put serialized
selection. Will be advanced to end of
serialized selection.
H5F_t *f; IN: File pointer
RETURNS
Non-negative on success/Negative on failure
DESCRIPTION
@ -482,7 +484,7 @@ H5S_none_serial_size(const H5S_t H5_ATTR_UNUSED *space)
REVISION LOG
--------------------------------------------------------------------------*/
static herr_t
H5S_none_serialize(const H5S_t *space, uint8_t **p)
H5S_none_serialize(const H5S_t *space, uint8_t **p, H5F_t H5_ATTR_UNUSED *f)
{
uint8_t *pp = (*p); /* Local pointer for decoding */
@ -494,8 +496,8 @@ H5S_none_serialize(const H5S_t *space, uint8_t **p)
HDassert(pp);
/* Store the preamble information */
UINT32ENCODE(pp, (uint32_t)H5S_GET_SELECT_TYPE(space)); /* Store the type of selection */
UINT32ENCODE(pp, (uint32_t)1); /* Store the version number */
UINT32ENCODE(pp, (uint32_t)H5S_GET_SELECT_TYPE(space)); /* Store the type of selection */
UINT32ENCODE(pp, (uint32_t)H5S_NONE_VERSION_1); /* Store the version number */
UINT32ENCODE(pp, (uint32_t)0); /* Store the un-used padding */
UINT32ENCODE(pp, (uint32_t)0); /* Store the additional information length */

View File

@ -33,8 +33,28 @@
#define H5S_VALID_PERM 0x02
/* Flags for serialization of selections */
#define H5S_SELECT_FLAG_UNLIM 0x01
#define H5S_SELECT_FLAG_BITS (H5S_SELECT_FLAG_UNLIM)
#define H5S_HYPER_REGULAR 0x01
#define H5S_SELECT_FLAG_BITS (H5S_HYPER_REGULAR)
/* Versions for H5S_SEL_HYPER selection info */
#define H5S_HYPER_VERSION_1 1
#define H5S_HYPER_VERSION_2 2
/* Versions for H5S_SEL_POINTS selection info */
#define H5S_POINT_VERSION_1 1
/* Versions for H5S_SEL_NONE selection info */
#define H5S_NONE_VERSION_1 1
/* Versions for H5S_SEL_ALL selection info */
#define H5S_ALL_VERSION_1 1
/* Size of point/offset info for H5S_SEL_POINTS/H5S_SEL_HYPER */
#define H5S_INFO_SIZE_4 0x04 /* 4 bytes: 32 bits */
#define H5S_INFO_SIZE_8 0x08 /* 8 bytes: 64 bits */
#define H5S_SELECT_INFO_SIZE_BITS (H5S_INFO_SIZE_4|H5S_INFO_SIZE_8)
#define H5S_UINT32_MAX 4294967295 /* 2^32 - 1 */
/* Length of stack-allocated sequences for "project intersect" routines */
#define H5S_PROJECT_INTERSECT_NSEQS 256
@ -139,9 +159,9 @@ typedef herr_t (*H5S_sel_release_func_t)(H5S_t *space);
/* Method to determine if current selection is valid for dataspace */
typedef htri_t (*H5S_sel_is_valid_func_t)(const H5S_t *space);
/* Method to determine number of bytes required to store current selection */
typedef hssize_t (*H5S_sel_serial_size_func_t)(const H5S_t *space);
typedef hssize_t (*H5S_sel_serial_size_func_t)(const H5S_t *space, H5F_t *f);
/* Method to store current selection in "serialized" form (a byte sequence suitable for storing on disk) */
typedef herr_t (*H5S_sel_serialize_func_t)(const H5S_t *space, uint8_t **p);
typedef herr_t (*H5S_sel_serialize_func_t)(const H5S_t *space, uint8_t **p, H5F_t *f);
/* Method to create selection from "serialized" form (a byte sequence suitable for storing on disk) */
typedef herr_t (*H5S_sel_deserialize_func_t)(H5S_t *space, uint32_t version, uint8_t flags,
const uint8_t **p);
@ -225,7 +245,7 @@ typedef hsize_t (*H5S_sel_iter_nelmts_func_t)(const H5S_sel_iter_t *iter);
/* Method to determine if there are more blocks left in the current selection */
typedef htri_t (*H5S_sel_iter_has_next_block_func_t)(const H5S_sel_iter_t *iter);
/* Method to move selection iterator to the next element in the selection */
typedef herr_t (*H5S_sel_iter_next_func_t)(H5S_sel_iter_t *iter, size_t nelem);
typedef herr_t (*H5S_sel_iter_next_func_t)(H5S_sel_iter_t *iter, hsize_t nelem);
/* Method to move selection iterator to the next block in the selection */
typedef herr_t (*H5S_sel_iter_next_block_func_t)(H5S_sel_iter_t *iter);
/* Method to release iterator for current selection */
@ -265,8 +285,9 @@ H5_DLLVAR const H5S_select_class_t H5S_sel_none[1];
*/
H5_DLLVAR const H5S_select_class_t H5S_sel_point[1];
/* Array of versions for Dataspace */
/* Array of versions for Dataspace and hyperslab selections */
H5_DLLVAR const unsigned H5O_sdspace_ver_bounds[H5F_LIBVER_NBOUNDS];
H5_DLLVAR const unsigned H5O_sds_hyper_ver_bounds[H5F_LIBVER_NBOUNDS];
/* Extent functions */
H5_DLL herr_t H5S_extent_release(H5S_extent_t *extent);

View File

@ -38,8 +38,8 @@ static herr_t H5S_point_get_seq_list(const H5S_t *space, unsigned flags,
size_t *nseq, size_t *nbytes, hsize_t *off, size_t *len);
static herr_t H5S_point_release(H5S_t *space);
static htri_t H5S_point_is_valid(const H5S_t *space);
static hssize_t H5S_point_serial_size(const H5S_t *space);
static herr_t H5S_point_serialize(const H5S_t *space, uint8_t **p);
static hssize_t H5S_point_serial_size(const H5S_t *space, H5F_t *f);
static herr_t H5S_point_serialize(const H5S_t *space, uint8_t **p, H5F_t *f);
static herr_t H5S_point_deserialize(H5S_t *space, uint32_t version, uint8_t flags,
const uint8_t **p);
static herr_t H5S_point_bounds(const H5S_t *space, hsize_t *start, hsize_t *end);
@ -58,7 +58,7 @@ static herr_t H5S_point_iter_coords(const H5S_sel_iter_t *iter, hsize_t *coords)
static herr_t H5S_point_iter_block(const H5S_sel_iter_t *iter, hsize_t *start, hsize_t *end);
static hsize_t H5S_point_iter_nelmts(const H5S_sel_iter_t *iter);
static htri_t H5S_point_iter_has_next_block(const H5S_sel_iter_t *iter);
static herr_t H5S_point_iter_next(H5S_sel_iter_t *sel_iter, size_t nelem);
static herr_t H5S_point_iter_next(H5S_sel_iter_t *sel_iter, hsize_t nelem);
static herr_t H5S_point_iter_next_block(H5S_sel_iter_t *sel_iter);
static herr_t H5S_point_iter_release(H5S_sel_iter_t *sel_iter);
@ -278,7 +278,7 @@ done:
USAGE
herr_t H5S_point_iter_next(iter, nelem)
H5S_sel_iter_t *iter; IN: Pointer to selection iterator
size_t nelem; IN: Number of elements to advance by
hsize_t nelem; IN: Number of elements to advance by
RETURNS
Non-negative on success/Negative on failure
DESCRIPTION
@ -289,7 +289,7 @@ done:
REVISION LOG
--------------------------------------------------------------------------*/
static herr_t
H5S_point_iter_next(H5S_sel_iter_t *iter, size_t nelem)
H5S_point_iter_next(H5S_sel_iter_t *iter, hsize_t nelem)
{
FUNC_ENTER_NOAPI_NOINIT_NOERR
@ -376,7 +376,7 @@ H5S_point_iter_release (H5S_sel_iter_t H5_ATTR_UNUSED * iter)
USAGE
herr_t H5S_point_add(space, num_elem, coord)
H5S_t *space; IN: Dataspace of selection to modify
size_t num_elem; IN: Number of elements in COORD array.
hsize_t num_elem; IN: Number of elements in COORD array.
const hsize_t *coord[]; IN: The location of each element selected
RETURNS
Non-negative on success/Negative on failure
@ -388,7 +388,7 @@ H5S_point_iter_release (H5S_sel_iter_t H5_ATTR_UNUSED * iter)
REVISION LOG
--------------------------------------------------------------------------*/
static herr_t
H5S_point_add(H5S_t *space, H5S_seloper_t op, size_t num_elem, const hsize_t *coord)
H5S_point_add(H5S_t *space, H5S_seloper_t op, hsize_t num_elem, const hsize_t *coord)
{
H5S_pnt_node_t *top = NULL, *curr = NULL, *new_node = NULL; /* Point selection nodes */
unsigned u; /* Counter */
@ -527,7 +527,7 @@ H5S_point_release (H5S_t *space)
herr_t H5S_select_elements(dsid, op, num_elem, coord)
hid_t dsid; IN: Dataspace ID of selection to modify
H5S_seloper_t op; IN: Operation to perform on current selection
size_t num_elem; IN: Number of elements in COORD array.
hsize_t num_elem; IN: Number of elements in COORD array.
const hsize_t *coord; IN: The location of each element selected
RETURNS
Non-negative on success/Negative on failure
@ -549,7 +549,7 @@ H5S_point_release (H5S_t *space)
REVISION LOG
--------------------------------------------------------------------------*/
herr_t
H5S_select_elements(H5S_t *space, H5S_seloper_t op, size_t num_elem,
H5S_select_elements(H5S_t *space, H5S_seloper_t op, hsize_t num_elem,
const hsize_t *coord)
{
herr_t ret_value = SUCCEED; /* return value */
@ -752,6 +752,93 @@ done:
FUNC_LEAVE_API(ret_value)
} /* H5Sget_select_elem_npoints() */
/*--------------------------------------------------------------------------
NAME
H5S_point_set_version
PURPOSE
Determine the version to use for encoding points selection info
USAGE
hssize_t H5S_point_set_version(space, bounds_end, f, version)
const H5S_t *space; IN: The dataspace
hsize_t bounds_end: IN: The selection high bounds
H5F_t *f: IN: The file pointer
uint32_t *version: OUT: The version to use for encoding
RETURNS
The version to use
DESCRIPTION
Determine the version to use for encoding points selection info:
For 1.10, return 1
GLOBAL VARIABLES
COMMENTS, BUGS, ASSUMPTIONS
EXAMPLES
REVISION LOG
--------------------------------------------------------------------------*/
static herr_t
H5S_point_set_version(const H5S_t *space, hsize_t bounds_end[], H5F_t *f, uint32_t *version)
{
hbool_t exceed = FALSE;
unsigned u;
herr_t ret_value = SUCCEED; /* return value */
FUNC_ENTER_NOAPI_NOINIT
*version = H5S_POINT_VERSION_1;
/* Determine whether the number of points or the high bounds in the selection exceed (2^32 - 1) */
for(u = 0; u < space->extent.rank; u++)
if(bounds_end[u] > H5S_UINT32_MAX) {
exceed = TRUE;
break;
}
if(space->select.num_elem > H5S_UINT32_MAX)
HGOTO_ERROR(H5E_DATASPACE, H5E_BADVALUE, FAIL, "The number of points in point selection exceeds 2^32")
else if(exceed)
HGOTO_ERROR(H5E_DATASPACE, H5E_BADVALUE, FAIL, "The end of bounding box in point selection exceeds 2^32")
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* H5S_point_set_version() */
/*--------------------------------------------------------------------------
NAME
H5S_point_set_info_size
PURPOSE
Determine the size of point info to use for encoding selection info
USAGE
hssize_t H5S_point_set_info_size(space, bounds_end, version, point_size)
const H5S_t *space: IN: Dataspace ID of selection to query
hsize_t bounds_end[]: IN: The selection high bounds
uint32_t version: IN: The version used for encoding
uint8_t *point_size: OUT: The size of point info
RETURNS
The size of the points selection info
DESCRIPTION
Determine the size for encoding points selection info:
For 1.10, return 4
GLOBAL VARIABLES
COMMENTS, BUGS, ASSUMPTIONS
EXAMPLES
REVISION LOG
--------------------------------------------------------------------------*/
static herr_t
H5S_point_set_info_size(const H5S_t *space, hsize_t H5_ATTR_UNUSED bounds_end[], uint32_t H5_ATTR_UNUSED version, uint8_t H5_ATTR_UNUSED *point_size)
{
hsize_t max_size = 0;
unsigned u;
FUNC_ENTER_NOAPI_NOINIT_NOERR
HDassert(version == H5S_POINT_VERSION_1);
*point_size = H5S_INFO_SIZE_4;
FUNC_LEAVE_NOAPI(SUCCEED)
} /* H5S_point_set_info_size() */
/*--------------------------------------------------------------------------
NAME
@ -760,8 +847,9 @@ done:
Determine the number of bytes needed to store the serialized point selection
information.
USAGE
hssize_t H5S_point_serial_size(space)
hssize_t H5S_point_serial_size(space, f)
H5S_t *space; IN: Dataspace pointer to query
H5F_t *f; IN: File pointer
RETURNS
The number of bytes required on success, negative on an error.
DESCRIPTION
@ -773,29 +861,54 @@ done:
REVISION LOG
--------------------------------------------------------------------------*/
static hssize_t
H5S_point_serial_size (const H5S_t *space)
H5S_point_serial_size (const H5S_t *space, H5F_t *f)
{
H5S_pnt_node_t *curr; /* Point information nodes */
hsize_t bounds_start[H5S_MAX_RANK];
hsize_t bounds_end[H5S_MAX_RANK];
uint32_t version; /* Version number */
uint8_t point_size; /* Size of point info */
hssize_t ret_value = -1; /* Return value */
FUNC_ENTER_NOAPI_NOINIT_NOERR
FUNC_ENTER_NOAPI_NOINIT
HDassert(space);
/* Basic number of bytes required to serialize point selection:
/* Get bounding box for the selection */
HDmemset(bounds_end, 0, sizeof(bounds_end));
if(H5S_point_bounds(space, bounds_start, bounds_end) < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTGET, FAIL, "can't get selection bounds")
/* Determine the version */
if(H5S_point_set_version(space, bounds_end, f, &version) < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTGET, FAIL, "can't determine hyper version")
/* Determine the size of point info */
if(H5S_point_set_info_size(space, bounds_end, version, &point_size) < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTGET, FAIL, "can't determine hyper version")
HDassert(version == H5S_POINT_VERSION_1);
HDassert(point_size == H5S_INFO_SIZE_4);
/* Basic number of bytes required to serialize point selection: */
/*
* <type (4 bytes)> + <version (4 bytes)> + <padding (4 bytes)> +
* <length (4 bytes)> + <rank (4 bytes)> + <# of points (4 bytes)> = 24 bytes
* <length (4 bytes)> + <rank (4 bytes)>
*/
ret_value = 24;
ret_value=20;
/* <num points (depend on point_size)> */
ret_value += point_size;
/* Count points in selection */
curr=space->select.sel_info.pnt_lst->head;
while(curr!=NULL) {
/* Add 4 bytes times the rank for each element selected */
ret_value+=4*space->extent.rank;
curr=curr->next;
/* Add <point_size> bytes times the rank for each element selected */
ret_value += point_size * space->extent.rank;
curr = curr->next;
} /* end while */
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5S_point_serial_size() */
@ -806,11 +919,12 @@ H5S_point_serial_size (const H5S_t *space)
PURPOSE
Serialize the current selection into a user-provided buffer.
USAGE
herr_t H5S_point_serialize(space, p)
herr_t H5S_point_serialize(space, p, f)
const H5S_t *space; IN: Dataspace with selection to serialize
uint8_t **p; OUT: Pointer to buffer to put serialized
selection. Will be advanced to end of
serialized selection.
H5F_t *f; IN: File pointer
RETURNS
Non-negative on success/Negative on failure
DESCRIPTION
@ -822,41 +936,63 @@ H5S_point_serial_size (const H5S_t *space)
REVISION LOG
--------------------------------------------------------------------------*/
static herr_t
H5S_point_serialize (const H5S_t *space, uint8_t **p)
H5S_point_serialize (const H5S_t *space, uint8_t **p, H5F_t *f)
{
H5S_pnt_node_t *curr; /* Point information nodes */
uint8_t *pp = (*p); /* Local pointer for decoding */
uint8_t *lenp; /* pointer to length location for later storage */
uint32_t len=0; /* number of bytes used */
unsigned u; /* local counting variable */
uint32_t version; /* Version number */
uint8_t point_size; /* Size of point info */
hsize_t bounds_start[H5S_MAX_RANK];
hsize_t bounds_end[H5S_MAX_RANK];
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_NOAPI_NOINIT_NOERR
FUNC_ENTER_NOAPI_NOINIT
/* Check args */
HDassert(space);
HDassert(p);
HDassert(pp);
/* Get bounding box for the selection */
HDmemset(bounds_end, 0, sizeof(bounds_end));
if(H5S_point_bounds(space, bounds_start, bounds_end) < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTGET, FAIL, "can't get selection bounds")
/* Determine the version */
if(H5S_point_set_version(space, bounds_end, f, &version) < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTGET, FAIL, "can't determine hyper version")
/* Determine the size of point info */
if(H5S_point_set_info_size(space, bounds_end, version, &point_size) < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTGET, FAIL, "can't determine hyper version")
HDassert(point_size == H5S_INFO_SIZE_4);
HDassert(version == H5S_POINT_VERSION_1);
/* Store the preamble information */
UINT32ENCODE(pp, (uint32_t)H5S_GET_SELECT_TYPE(space)); /* Store the type of selection */
UINT32ENCODE(pp, (uint32_t)1); /* Store the version number */
UINT32ENCODE(pp, version); /* Store the version number */
UINT32ENCODE(pp, (uint32_t)0); /* Store the un-used padding */
lenp = pp; /* Keep the pointer to the length location for later */
pp += 4; /* Skip over space for length */
lenp = pp; /* Keep the pointer to the length location for later */
pp += 4; /* Skip over space for length */
len += 8; /* Add in advance # of bytes for num of dimensions and num elements */
/* Encode number of dimensions */
UINT32ENCODE(pp, (uint32_t)space->extent.rank);
len+=4;
/* Encode number of elements */
UINT32ENCODE(pp, (uint32_t)space->select.num_elem);
len+=4;
/* Encode each point in selection */
curr=space->select.sel_info.pnt_lst->head;
while(curr!=NULL) {
/* Add 4 bytes times the rank for each element selected */
len+=4*space->extent.rank;
len += 4 * space->extent.rank;
/* Encode each point */
for(u=0; u<space->extent.rank; u++)
@ -871,7 +1007,8 @@ H5S_point_serialize (const H5S_t *space, uint8_t **p)
/* Update encoding pointer */
*p = pp;
FUNC_LEAVE_NOAPI(SUCCEED)
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* H5S_point_serialize() */
@ -906,7 +1043,7 @@ H5S_point_deserialize(H5S_t *space, uint32_t H5_ATTR_UNUSED version, uint8_t H5_
H5S_seloper_t op = H5S_SELECT_SET; /* Selection operation */
hsize_t *coord = NULL, *tcoord; /* Pointer to array of elements */
const uint8_t *pp = (*p); /* Local pointer for decoding */
size_t num_elem = 0; /* Number of elements in selection */
hsize_t num_elem = 0; /* Number of elements in selection */
unsigned rank; /* Rank of points */
unsigned i, j; /* local counting variables */
herr_t ret_value = SUCCEED; /* Return value */
@ -1620,7 +1757,7 @@ H5Sselect_elements(hid_t spaceid, H5S_seloper_t op, size_t num_elem,
HGOTO_ERROR(H5E_ARGS, H5E_UNSUPPORTED, FAIL, "unsupported operation attempted")
/* Call the real element selection routine */
if((ret_value = H5S_select_elements(space, op, num_elem, coord)) < 0)
if((ret_value = H5S_select_elements(space, op, (hsize_t)num_elem, coord)) < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDELETE, FAIL, "can't select elements")
done:

View File

@ -148,8 +148,9 @@ typedef struct H5S_sel_iter_op_t {
#define H5S_GET_SELECT_TYPE(S) ((S)->select.type->type)
#define H5S_SELECT_GET_SEQ_LIST(S,FLAGS,ITER,MAXSEQ,MAXBYTES,NSEQ,NBYTES,OFF,LEN) ((*(S)->select.type->get_seq_list)(S,FLAGS,ITER,MAXSEQ,MAXBYTES,NSEQ,NBYTES,OFF,LEN))
#define H5S_SELECT_VALID(S) ((*(S)->select.type->is_valid)(S))
#define H5S_SELECT_SERIAL_SIZE(S) ((*(S)->select.type->serial_size)(S))
#define H5S_SELECT_SERIALIZE(S,BUF) ((*(S)->select.type->serialize)(S,BUF))
#define H5S_SELECT_RELEASE(S) ((*(S)->select.type->release)(S))
#define H5S_SELECT_SERIAL_SIZE(S,F) ((*(S)->select.type->serial_size)(S,F))
#define H5S_SELECT_SERIALIZE(S,BUF,F) ((*(S)->select.type->serialize)(S,BUF,F))
#define H5S_SELECT_BOUNDS(S,START,END) ((*(S)->select.type->bounds)(S,START,END))
#define H5S_SELECT_OFFSET(S, OFFSET) ((*(S)->select.type->offset)(S, OFFSET))
#define H5S_SELECT_IS_CONTIGUOUS(S) ((*(S)->select.type->is_contiguous)(S))
@ -173,8 +174,9 @@ typedef struct H5S_sel_iter_op_t {
#define H5S_GET_SELECT_TYPE(S) (H5S_get_select_type(S))
#define H5S_SELECT_GET_SEQ_LIST(S,FLAGS,ITER,MAXSEQ,MAXBYTES,NSEQ,NBYTES,OFF,LEN) (H5S_select_get_seq_list(S,FLAGS,ITER,MAXSEQ,MAXBYTES,NSEQ,NBYTES,OFF,LEN))
#define H5S_SELECT_VALID(S) (H5S_select_valid(S))
#define H5S_SELECT_SERIAL_SIZE(S) (H5S_select_serial_size(S))
#define H5S_SELECT_SERIALIZE(S,BUF) (H5S_select_serialize(S,BUF))
#define H5S_SELECT_RELEASE(S) (H5S_select_release(S))
#define H5S_SELECT_SERIAL_SIZE(S,F) (H5S_select_serial_size(S,F))
#define H5S_SELECT_SERIALIZE(S,BUF,F) (H5S_select_serialize(S,BUF,F))
#define H5S_SELECT_BOUNDS(S,START,END) (H5S_get_select_bounds(S,START,END))
#define H5S_SELECT_OFFSET(S, OFFSET) (H5S_get_select_offset(S, OFFSET))
#define H5S_SELECT_IS_CONTIGUOUS(S) (H5S_select_is_contiguous(S))
@ -193,7 +195,6 @@ typedef struct H5S_sel_iter_op_t {
#endif /* H5S_MODULE */
/* Handle these callbacks in a special way, since they have prologs that need to be executed */
#define H5S_SELECT_COPY(DST,SRC,SHARE) (H5S_select_copy(DST,SRC,SHARE))
#define H5S_SELECT_RELEASE(S) (H5S_select_release(S))
#define H5S_SELECT_DESERIALIZE(S,BUF) (H5S_select_deserialize(S,BUF))
@ -219,7 +220,7 @@ H5_DLL herr_t H5S_get_validated_dataspace(hid_t space_id, const H5S_t **space/*o
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);
H5_DLL herr_t H5S_encode(H5S_t *obj, unsigned char **p, size_t *nalloc);
H5_DLL herr_t H5S_encode(H5S_t *obj, unsigned char **p, size_t *nalloc, hid_t fapl_id);
H5_DLL H5S_t *H5S_decode(const unsigned char **p);
H5_DLL herr_t H5S_debug(H5F_t *f, const void *_mesg, FILE *stream, int indent,
int fwidth);
@ -254,8 +255,8 @@ H5_DLL herr_t H5S_select_release(H5S_t *ds);
H5_DLL herr_t H5S_select_get_seq_list(const H5S_t *space, unsigned flags,
H5S_sel_iter_t *iter, size_t maxseq, size_t maxbytes,
size_t *nseq, size_t *nbytes, hsize_t *off, size_t *len);
H5_DLL hssize_t H5S_select_serial_size(const H5S_t *space);
H5_DLL herr_t H5S_select_serialize(const H5S_t *space, uint8_t **p);
H5_DLL hssize_t H5S_select_serial_size(const H5S_t *space, H5F_t *f);
H5_DLL herr_t H5S_select_serialize(const H5S_t *space, uint8_t **p, H5F_t *f);
H5_DLL htri_t H5S_select_is_contiguous(const H5S_t *space);
H5_DLL htri_t H5S_select_is_single(const H5S_t *space);
H5_DLL htri_t H5S_select_is_regular(const H5S_t *space);
@ -275,7 +276,7 @@ H5_DLL herr_t H5S_select_none(H5S_t *space);
/* Operations on point selections */
H5_DLL herr_t H5S_select_elements(H5S_t *space, H5S_seloper_t op,
size_t num_elem, const hsize_t *coord);
hsize_t num_elem, const hsize_t *coord);
/* Operations on hyperslab selections */
H5_DLL herr_t H5S_select_hyperslab(H5S_t *space, H5S_seloper_t op, const hsize_t start[],
@ -305,7 +306,7 @@ H5_DLL hsize_t H5S_hyper_get_first_inc_block(const H5S_t *space,
H5_DLL herr_t H5S_select_iter_init(H5S_sel_iter_t *iter, const H5S_t *space, size_t elmt_size);
H5_DLL herr_t H5S_select_iter_coords(const H5S_sel_iter_t *sel_iter, hsize_t *coords);
H5_DLL hsize_t H5S_select_iter_nelmts(const H5S_sel_iter_t *sel_iter);
H5_DLL herr_t H5S_select_iter_next(H5S_sel_iter_t *sel_iter, size_t nelem);
H5_DLL herr_t H5S_select_iter_next(H5S_sel_iter_t *sel_iter, hsize_t nelem);
H5_DLL herr_t H5S_select_iter_release(H5S_sel_iter_t *sel_iter);
#ifdef H5_HAVE_PARALLEL

View File

@ -223,7 +223,7 @@ done:
*-------------------------------------------------------------------------
*/
hssize_t
H5S_select_serial_size(const H5S_t *space)
H5S_select_serial_size(const H5S_t *space, H5F_t *f)
{
hssize_t ret_value = -1; /* Return value */
@ -232,7 +232,7 @@ H5S_select_serial_size(const H5S_t *space)
HDassert(space);
/* Call the selection type's serial_size function */
ret_value=(*space->select.type->serial_size)(space);
ret_value=(*space->select.type->serial_size)(space, f);
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5S_select_serial_size() */
@ -249,6 +249,7 @@ H5S_select_serial_size(const H5S_t *space)
uint8_t **p; OUT: Pointer to buffer to put serialized
selection. Will be advanced to end of
serialized selection.
H5F_t *f; IN: File pointer
RETURNS
Non-negative on success/Negative on failure
DESCRIPTION
@ -263,7 +264,7 @@ H5S_select_serial_size(const H5S_t *space)
REVISION LOG
--------------------------------------------------------------------------*/
herr_t
H5S_select_serialize(const H5S_t *space, uint8_t **p)
H5S_select_serialize(const H5S_t *space, uint8_t **p, H5F_t *f)
{
herr_t ret_value=SUCCEED; /* Return value */
@ -273,7 +274,7 @@ H5S_select_serialize(const H5S_t *space, uint8_t **p)
HDassert(p);
/* Call the selection type's serialize function */
ret_value=(*space->select.type->serialize)(space,p);
ret_value=(*space->select.type->serialize)(space,p,f);
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5S_select_serialize() */
@ -1222,7 +1223,7 @@ H5S_select_iter_has_next_block(const H5S_sel_iter_t *iter)
USAGE
herr_t H5S_select_iter_next(iter, nelem)
H5S_sel_iter_t *iter; IN/OUT: Selection iterator to change
size_t nelem; IN: Number of elements to advance by
hsize_t nelem; IN: Number of elements to advance by
RETURNS
Non-negative on success, negative on failure.
DESCRIPTION
@ -1237,7 +1238,7 @@ H5S_select_iter_has_next_block(const H5S_sel_iter_t *iter)
REVISION LOG
--------------------------------------------------------------------------*/
herr_t
H5S_select_iter_next(H5S_sel_iter_t *iter, size_t nelem)
H5S_select_iter_next(H5S_sel_iter_t *iter, hsize_t nelem)
{
herr_t ret_value = FAIL; /* Return value */

View File

@ -2961,7 +2961,7 @@ H5T_encode(H5T_t *obj, unsigned char *buf, size_t *nalloc)
FUNC_ENTER_NOAPI_NOINIT
/* Allocate "fake" file structure */
if(NULL == (f = H5F_fake_alloc((uint8_t)0)))
if(NULL == (f = H5F_fake_alloc((uint8_t)0, H5P_FILE_ACCESS_DEFAULT)))
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTALLOC, FAIL, "can't allocate fake file struct")
/* Find out the size of buffer needed */
@ -3016,7 +3016,7 @@ H5T_decode(size_t buf_size, const unsigned char *buf)
FUNC_ENTER_NOAPI_NOINIT
/* Allocate "fake" file structure */
if(NULL == (f = H5F_fake_alloc((uint8_t)0)))
if(NULL == (f = H5F_fake_alloc((uint8_t)0, H5P_FILE_ACCESS_DEFAULT)))
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTALLOC, NULL, "can't allocate fake file struct")
/* Decode the type of the information */

View File

@ -92,11 +92,11 @@ extern "C" {
/* Version numbers */
#define H5_VERS_MAJOR 1 /* For major interface/format changes */
#define H5_VERS_MINOR 11 /* For minor interface/format changes */
#define H5_VERS_RELEASE 2 /* For tweaks, bug-fixes, or development */
#define H5_VERS_SUBRELEASE "" /* For pre-releases like snap0 */
#define H5_VERS_MINOR 10 /* For minor interface/format changes */
#define H5_VERS_RELEASE 3 /* For tweaks, bug-fixes, or development */
#define H5_VERS_SUBRELEASE "snap4" /* For pre-releases like snap0 */
/* Empty string for real releases. */
#define H5_VERS_INFO "HDF5 library version: 1.11.2" /* Full version string */
#define H5_VERS_INFO "HDF5 library version: 1.10.3-snap4" /* Full version string */
#define H5check() H5check_version(H5_VERS_MAJOR,H5_VERS_MINOR, \
H5_VERS_RELEASE)

View File

@ -4967,7 +4967,7 @@ test_libver_bounds_real(H5F_libver_t libver_create, unsigned oh_vers_create,
#define VERBFNAME "tverbounds_dspace.h5"
#define VERBDSNAME "dataset 1"
#define SPACE1_DIM1 3
static void
static int
test_libver_bounds_open(void)
{
hid_t file = -1; /* File ID */

View File

@ -93,6 +93,10 @@ struct space4_struct {
char c2;
} space4_data={'v',987123,-3.14F,'g'}; /* Test data for 4th dataspace */
/* Used in test_h5s_encode_irregular_exceed32() and test_h5s_encode_points_exceed32() */
#define POWER32 4294967296 /* 2^32 */
/****************************************************************
**
** test_h5s_basic(): Test basic H5S (dataspace) code.
@ -2502,6 +2506,188 @@ test_versionbounds(void)
} /* end test_versionbounds() */
/****************************************************************
**
** test_h5s_encode_regular_exceed32():
** Test to verify HDFFV-9947 is fixed.
** Verify that selection encoding that exceeds (2^32 - 1)
** (32 bit integer limit) is correctly encoded.
**
** Note: See encoding changes for 1.10 in
** "RFC: H5Sencode/H5Sdecode Format Change".
**
****************************************************************/
static void
test_h5s_encode_regular_exceed32(void)
{
hid_t sid; /* Dataspace ID */
hid_t decoded_sid; /* Dataspace ID from H5Sdecode */
size_t sbuf_size=0; /* Buffer size for H5Sencode */
unsigned char *sbuf=NULL; /* Buffer for H5Sencode */
hssize_t num; /* Number of elements in the dataspace selection */
hssize_t decoded_num; /* Number of elements in the dataspace selection from H5Sdeocde */
hsize_t numparticles = 8388608;
unsigned num_dsets = 513;
hsize_t total_particles = numparticles * num_dsets;
hsize_t vdsdims[1] = {total_particles};
hsize_t start, count, block;
herr_t ret; /* Generic return value */
MESSAGE(5, ("Testing Dataspace encoding regular hyperslabs that exceeds 32 bits\n"));
/*-------------------------------------------------------------------------
* Test encoding and decoding of simple dataspace and hyperslab selection.
*-------------------------------------------------------------------------
*/
sid = H5Screate_simple(1, vdsdims, NULL);
CHECK(sid, FAIL, "H5Screate_simple");
start = 0;
block = total_particles;
count = 1;
ret = H5Sselect_hyperslab(sid, H5S_SELECT_SET, &start, NULL, &count, &block);
CHECK(ret, FAIL, "H5Sselect_hyperslab");
/* Encode simple data space in a buffer */
ret = H5Sencode(sid, NULL, &sbuf_size);
CHECK(ret, FAIL, "H5Sencode2");
if(sbuf_size > 0) {
sbuf = (unsigned char*)HDcalloc((size_t)1, sbuf_size);
CHECK(sbuf, NULL, "H5Sencode");
}
/* The version used for encoding should be 2 */
ret = H5Sencode(sid, sbuf, &sbuf_size);
CHECK(ret, FAIL, "H5Sencode");
VERIFY((uint32_t)sbuf[35], 2, "Version for regular hyperslab that exceeds 32 bits");
/* Decode from the dataspace buffer and return an object handle */
decoded_sid = H5Sdecode(sbuf);
CHECK(decoded_sid, FAIL, "H5Sdecode");
/* Verify the decoded dataspace */
decoded_num = H5Sget_select_npoints(decoded_sid);
CHECK(decoded_num, FAIL, "H5Sget_select_npoints");
num = H5Sget_select_npoints(sid);
CHECK(num, FAIL, "H5Sget_select_npoints");
VERIFY(num, decoded_num, "H5Sget_select_npoints");
ret = H5Sclose(decoded_sid);
CHECK(ret, FAIL, "H5Sclose");
if(sbuf)
HDfree(sbuf);
ret = H5Sclose(sid);
CHECK(ret, FAIL, "H5Sclose");
} /* test_h5s_encode_regular_exceed32() */
/****************************************************************
**
** test_h5s_encode_irregular_exceed32():
** This test verifies that 1.10 H5Sencode() will fail for
** irregular hyperslab selection that exceeds 32 bits.
**
** Note: See encoding changes for 1.10 in
** "RFC: H5Sencode/H5Sdecode Format Change".
**
****************************************************************/
static void
test_h5s_encode_irregular_exceed32(void)
{
hid_t sid; /* Dataspace ID */
hsize_t numparticles = 8388608;
unsigned num_dsets = 513;
hsize_t total_particles = numparticles * num_dsets;
hsize_t vdsdims[1] = {total_particles}; /* Dimension size */
hsize_t start, stride, count, block; /* Selection info */
size_t sbuf_size=0; /* Buffer size for H5Sencode */
htri_t is_regular; /* Is this a regular hyperslab */
herr_t ret; /* Generic return value */
/* Output message about test being performed */
MESSAGE(5, ("Testing Dataspace encoding irregular hyperslab that exceeds 32 bits\n"));
sid = H5Screate_simple(1, vdsdims, NULL);
CHECK(sid, FAIL, "H5Screate_simple");
start = 0;
block = total_particles;
count = 1;
ret = H5Sselect_hyperslab(sid, H5S_SELECT_SET, &start, NULL, &count, &block);
CHECK(ret, FAIL, "H5Sselect_hyperslab");
start = 8;
count = 5;
block = 2;
stride = POWER32;
ret = H5Sselect_hyperslab(sid, H5S_SELECT_OR, &start, &stride, &count, &block);
CHECK(ret, FAIL, "H5Sselect_hyperslab");
/* Should be irregular hyperslab */
is_regular = H5Sis_regular_hyperslab(sid);
VERIFY(is_regular, FALSE, "H5Sis_regular_hyperslab");
/* Should fail because selection exceeds 32 bits */
ret = H5Sencode(sid, NULL, &sbuf_size);
VERIFY(ret, FAIL, "H5Sencode");
ret = H5Sclose(sid);
CHECK(ret, FAIL, "H5Sclose");
} /* test_h5s_encode_irregular_exceed32() */
/****************************************************************
**
** test_h5s_encode_points_exceed32():
** This test verifies that 1.10 H5Sencode() will fail for
** point selection that exceeds 32 bits.
**
** Note: See encoding changes for 1.10 in
** "RFC: H5Sencode/H5Sdecode Format Change".
**
****************************************************************/
static void
test_h5s_encode_points_exceed32(void)
{
hid_t sid; /* Dataspace ID */
hsize_t numparticles = 8388608;
unsigned num_dsets = 513;
hsize_t total_particles = numparticles * num_dsets;
hsize_t vdsdims[1] = {total_particles}; /* Dimension size */
hsize_t coord[4]; /* The point coordinates */
size_t sbuf_size=0; /* Buffer size for H5Sencode */
herr_t ret; /* Generic return value */
/* Output message about test being performed */
MESSAGE(5, ("Testing Dataspace encoding points selection that exceeds 32 bits\n"));
sid = H5Screate_simple(1, vdsdims, NULL);
CHECK(sid, FAIL, "H5Screate_simple");
coord[0] = 5;
coord[1] = 15;
coord[2] = POWER32;
coord[3] = 19;
ret = H5Sselect_elements(sid, H5S_SELECT_SET, (size_t)4, coord);
CHECK(ret, FAIL, "H5Sselect_elements");
/* Should fail because selection exceeds 32 bits */
ret = H5Sencode(sid, NULL, &sbuf_size);
VERIFY(ret, FAIL, "H5Sencode");
ret = H5Sclose(sid);
CHECK(ret, FAIL, "H5Sclose");
} /* test_h5s_encode_points_exceed32() */
/****************************************************************
**
** test_h5s(): Main H5S (dataspace) testing routine.
@ -2517,8 +2703,12 @@ test_h5s(void)
test_h5s_null(); /* Test Null dataspace H5S code */
test_h5s_zero_dim(); /* Test dataspace with zero dimension size */
test_h5s_encode(); /* Test encoding and decoding */
test_h5s_scalar_write(); /* Test scalar H5S writing code */
test_h5s_scalar_read(); /* Test scalar H5S reading code */
test_h5s_encode_regular_exceed32(); /* Test encoding regular hyperslab selection that exceeds 32 bits */
test_h5s_encode_irregular_exceed32(); /* Testing encoding irregular hyperslab selection that exceeds 32 bits */
test_h5s_encode_points_exceed32(); /* Testing encoding point selection that exceeds 32 bits */
test_h5s_scalar_write(); /* Test scalar H5S writing code */
test_h5s_scalar_read(); /* Test scalar H5S reading code */
test_h5s_compound_scalar_write(); /* Test compound datatype scalar H5S writing code */
test_h5s_compound_scalar_read(); /* Test compound datatype scalar H5S reading code */

View File

@ -490,46 +490,70 @@ test_reference_obj(void)
** test_reference_region(): Test basic H5R (reference) object reference code.
** Tests references to various kinds of objects
**
** Add test to verify that dataspace selection exceeding
** 32 bits is correctly encoded and referenced.
**
** Note: The "new_format" parameter is added to create the file with
** either the old or latest format. This is done so that the
** 1.10 encoding of dataspace selection for H5R_DATASET_REGION
** in the internal library will be done according to the file
** format setting in fapl.
** See encoding changes for 1.10 in
** "RFC: H5Sencode/H5Sdecode Format Change".
**
****************************************************************/
static void
test_reference_region(void)
test_reference_region(hbool_t new_format)
{
hid_t fid1; /* HDF5 File IDs */
hid_t dset1, /* Dataset ID */
dset2; /* Dereferenced dataset ID */
hid_t sid1, /* Dataspace ID #1 */
sid2; /* Dataspace ID #2 */
hid_t dapl_id; /* Dataset access property list */
hsize_t dims1[] = {SPACE1_DIM1},
dims2[] = {SPACE2_DIM1, SPACE2_DIM2};
hsize_t start[SPACE2_RANK]; /* Starting location of hyperslab */
hsize_t stride[SPACE2_RANK]; /* Stride of hyperslab */
hsize_t count[SPACE2_RANK]; /* Element count of hyperslab */
hsize_t block[SPACE2_RANK]; /* Block size of hyperslab */
hsize_t coord1[POINT1_NPOINTS][SPACE2_RANK]; /* Coordinates for point selection */
hsize_t * coords; /* Coordinate buffer */
hsize_t low[SPACE2_RANK]; /* Selection bounds */
hsize_t high[SPACE2_RANK]; /* Selection bounds */
hdset_reg_ref_t *wbuf, /* buffer to write to disk */
*rbuf; /* buffer read from disk */
hdset_reg_ref_t nvrbuf[3]={{0},{101},{255}}; /* buffer with non-valid refs */
uint8_t *dwbuf, /* Buffer for writing numeric data to disk */
*drbuf; /* Buffer for reading numeric data from disk */
uint8_t *tu8; /* Temporary pointer to uint8 data */
H5O_type_t obj_type; /* Type of object */
int i, j; /* counting variables */
hssize_t hssize_ret; /* hssize_t return value */
htri_t tri_ret; /* htri_t return value */
herr_t ret; /* Generic return value */
haddr_t addr = HADDR_UNDEF; /* test for undefined reference */
hid_t dset_NA; /* Dataset id for undefined reference */
hid_t space_NA; /* Dataspace id for undefined reference */
hsize_t dims_NA[1] = {1}; /* Dims array for undefined reference */
hdset_reg_ref_t wdata_NA[1], /* Write buffer */
rdata_NA[1]; /* Read buffer */
hid_t fid1; /* HDF5 File IDs */
hid_t fapl = -1; /* File access property list */
hid_t dset1, /* Dataset ID */
dset2, /* Dereferenced dataset ID */
dset3; /* Dereferenced dataset ID */
hid_t sid1, /* Dataspace ID #1 */
sid2, /* Dataspace ID #2 */
sid3; /* Dataspace ID #3 */
hid_t dapl_id; /* Dataset access property list */
hsize_t dims1[] = {SPACE1_DIM1},
dims2[] = {SPACE2_DIM1, SPACE2_DIM2};
hsize_t start[SPACE2_RANK]; /* Starting location of hyperslab */
hsize_t stride[SPACE2_RANK]; /* Stride of hyperslab */
hsize_t count[SPACE2_RANK]; /* Element count of hyperslab */
hsize_t block[SPACE2_RANK]; /* Block size of hyperslab */
hsize_t coord1[POINT1_NPOINTS][SPACE2_RANK]; /* Coordinates for point selection */
hsize_t *coords; /* Coordinate buffer */
hsize_t low[SPACE2_RANK]; /* Selection bounds */
hsize_t high[SPACE2_RANK]; /* Selection bounds */
hdset_reg_ref_t *wbuf, /* buffer to write to disk */
*rbuf; /* buffer read from disk */
hdset_reg_ref_t nvrbuf[3]={{0},{101},{255}}; /* buffer with non-valid refs */
uint8_t *dwbuf, /* Buffer for writing numeric data to disk */
*drbuf; /* Buffer for reading numeric data from disk */
uint8_t *tu8; /* Temporary pointer to uint8 data */
H5O_type_t obj_type; /* Type of object */
int i, j; /* counting variables */
hssize_t hssize_ret; /* hssize_t return value */
htri_t tri_ret; /* htri_t return value */
herr_t ret; /* Generic return value */
haddr_t addr = HADDR_UNDEF; /* test for undefined reference */
hid_t dset_NA; /* Dataset id for undefined reference */
hid_t space_NA; /* Dataspace id for undefined reference */
hsize_t dims_NA[1] = {1}; /* Dims array for undefined reference */
hdset_reg_ref_t wdata_NA[1], /* Write buffer */
rdata_NA[1]; /* Read buffer */
hsize_t numparticles = 8388608;
hsize_t ret_particles;
unsigned num_dsets = 513;
hsize_t total_particles = numparticles * num_dsets;
hsize_t vdsdims[1] = {total_particles};
hsize_t start3, count3, block3;
/* Output message about test being performed */
MESSAGE(5, ("Testing Dataset Region Reference Functions\n"));
if(new_format) {
MESSAGE(5, ("Testing Dataset Region Reference Functions for new format\n"));
} else {
MESSAGE(5, ("Testing Dataset Region Reference Functions for old format\n"));
}
/* Allocate write & read buffers */
wbuf = (hdset_reg_ref_t *)HDcalloc(sizeof(hdset_reg_ref_t), (size_t)SPACE1_DIM1);
@ -537,8 +561,16 @@ test_reference_region(void)
dwbuf = (uint8_t *)HDmalloc(sizeof(uint8_t) * SPACE2_DIM1 * SPACE2_DIM2);
drbuf = (uint8_t *)HDcalloc(sizeof(uint8_t), (size_t)(SPACE2_DIM1 * SPACE2_DIM2));
/* Set to use the latest file format */
fapl = H5Pcreate(H5P_FILE_ACCESS);
CHECK(fapl, FAIL, "H5Pcreate");
if(new_format) {
ret = H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST);
CHECK(ret, FAIL, "H5Pset_libver_bounds");
}
/* Create file */
fid1 = H5Fcreate(FILE2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
fid1 = H5Fcreate(FILE2, H5F_ACC_TRUNC, H5P_DEFAULT, fapl);
CHECK(fid1, FAIL, "H5Fcreate");
/* Create dataspace for datasets */
@ -564,11 +596,30 @@ test_reference_region(void)
ret = H5Dclose(dset2);
CHECK(ret, FAIL, "H5Dclose");
/* Create dataspace with selection exceeding 32 bits */
sid3 = H5Screate_simple(1, vdsdims, NULL);
CHECK(sid3, FAIL, "H5Screate_simple");
start3 = 0;
block3 = total_particles;
count3 = 1;
ret = H5Sselect_hyperslab(sid3, H5S_SELECT_SET, &start3, NULL, &count3, &block3);
CHECK(ret, FAIL, "H5Sselect_hyperslab");
/* Create the dataset with dataspace exceeding 32 bits */
dset3 = H5Dcreate2(fid1, "Dataset3", H5T_STD_U8LE, sid3, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
CHECK(dset3, FAIL, "H5Dcreate2");
/* Close Dataset */
ret = H5Dclose(dset3);
CHECK(ret, FAIL, "H5Dclose");
/* Create dataspace for the reference dataset */
sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL);
CHECK(sid1, FAIL, "H5Screate_simple");
/* Create a dataset */
/* Create the reference dataset */
dset1 = H5Dcreate2(fid1, "Dataset1", H5T_STD_REF_DSETREG, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
CHECK(ret, FAIL, "H5Dcreate2");
@ -627,10 +678,18 @@ test_reference_region(void)
/* Store third dataset region */
ret = H5Rcreate(&wbuf[2], fid1, "/Dataset2", H5R_DATASET_REGION, sid2);
CHECK(ret, FAIL, "H5Rcreate");
ret = H5Rget_obj_type2(dset1, H5R_DATASET_REGION, &wbuf[0], &obj_type);
ret = H5Rget_obj_type2(dset1, H5R_DATASET_REGION, &wbuf[2], &obj_type);
CHECK(ret, FAIL, "H5Rget_obj_type2");
VERIFY(obj_type, H5O_TYPE_DATASET, "H5Rget_obj_type2");
/* Store fourth dataset region */
ret = H5Rcreate(&wbuf[3], fid1, "/Dataset3", H5R_DATASET_REGION, sid3);
CHECK(ret, FAIL, "H5Rcreate");
ret = H5Rget_obj_type2(dset1, H5R_DATASET_REGION, &wbuf[3], &obj_type);
CHECK(ret, FAIL, "H5Rget_obj_type2");
VERIFY(obj_type, H5O_TYPE_DATASET, "H5Rget_obj_type2");
/* Write selection to disk */
ret = H5Dwrite(dset1, H5T_STD_REF_DSETREG, H5S_ALL, H5S_ALL, H5P_DEFAULT, wbuf);
CHECK(ret, FAIL, "H5Dwrite");
@ -672,6 +731,9 @@ test_reference_region(void)
ret = H5Sclose(sid2);
CHECK(ret, FAIL, "H5Sclose");
ret = H5Sclose(sid3);
CHECK(ret, FAIL, "H5Sclose");
/* Close file */
ret = H5Fclose(fid1);
CHECK(ret, FAIL, "H5Fclose");
@ -727,6 +789,28 @@ test_reference_region(void)
dset2 = H5Rdereference2(dset1, dapl_id, H5R_DATASET_REGION, &addr);
VERIFY(dset2, FAIL, "H5Rdereference2 haddr_undef");
/* Try to open the referenced dataset with dataspace exceeding 32 bits */
dset3 = H5Rdereference2(dset1, dapl_id, H5R_DATASET_REGION, &rbuf[3]);
CHECK(dset3, FAIL, "H5Rdereference2");
/* Check what H5Rget_obj_type2 function returns */
ret = H5Rget_obj_type2(dset1, H5R_DATASET_REGION, &rbuf[3], &obj_type);
CHECK(ret, FAIL, "H5Rget_obj_type2");
VERIFY(obj_type, H5O_TYPE_DATASET, "H5Rget_obj_type2");
/* Check information in the referenced dataset */
sid3 = H5Dget_space(dset3);
CHECK(sid3, FAIL, "H5Dget_space");
ret_particles = H5Sget_select_npoints(sid3);
VERIFY(ret_particles, total_particles, "H5Sget_select_npoints");
/* Close the dataspace and dataset */
ret = H5Sclose(sid3);
CHECK(ret, FAIL, "H5Sclose");
ret = H5Dclose(dset3);
CHECK(ret, FAIL, "H5Dclose");
/* Try to open objects */
dset2 = H5Rdereference2(dset1, dapl_id, H5R_DATASET_REGION, &rbuf[0]);
CHECK(dset2, FAIL, "H5Rdereference2");
@ -889,7 +973,7 @@ test_reference_region(void)
**
****************************************************************/
static void
test_reference_region_1D(void)
test_reference_region_1D(hbool_t new_format)
{
hid_t fid1; /* HDF5 File IDs */
hid_t dset1, /* Dataset ID */
@ -1736,14 +1820,16 @@ test_reference(void)
/* Output message about test being performed */
MESSAGE(5, ("Testing References\n"));
test_reference_params(); /* Test for correct parameter checking */
test_reference_obj(); /* Test basic H5R object reference code */
test_reference_region(); /* Test basic H5R dataset region reference code */
test_reference_region_1D(); /* Test H5R dataset region reference code for 1-D datasets */
test_reference_obj_deleted(); /* Test H5R object reference code for deleted objects */
test_reference_group(); /* Test operations on dereferenced groups */
test_reference_params(); /* Test for correct parameter checking */
test_reference_obj(); /* Test basic H5R object reference code */
test_reference_region(FALSE); /* Test basic H5R dataset region reference code */
test_reference_region(TRUE); /* Test basic H5R dataset region reference code */
test_reference_region_1D(FALSE); /* Test H5R dataset region reference code for 1-D datasets */
test_reference_region_1D(TRUE); /* Test H5R dataset region reference code for 1-D datasets */
test_reference_obj_deleted(); /* Test H5R object reference code for deleted objects */
test_reference_group(); /* Test operations on dereferenced groups */
#ifndef H5_NO_DEPRECATED_SYMBOLS
test_reference_compat(); /* Test operations with old API routines */
test_reference_compat(); /* Test operations with old API routines */
#endif /* H5_NO_DEPRECATED_SYMBOLS */
} /* test_reference() */

View File

@ -618,7 +618,10 @@ test_api(test_api_config_t config, hid_t fapl)
TEST_ERROR
/* Get examination DCPL */
if(test_api_get_ex_dcpl(config, fapl, dcpl, &ex_dcpl, vspace[0], filename, (hsize_t)213) < 0)
/* Should be a value of 174, not 213. HDFFV-10469 */
if(test_api_get_ex_dcpl(config, fapl, dcpl, &ex_dcpl, vspace[0], filename, (hsize_t)174) < 0)
TEST_ERROR
/* Test H5Pget_virtual_count */

View File

@ -11,7 +11,7 @@ GROUP "/" {
USER_DEFINED_FILTER {
FILTER_ID 260
COMMENT dynlib4
PARAMS { 9 1 11 2 }
PARAMS { 9 1 10 3 }
}
}
FILLVALUE {
@ -33,7 +33,7 @@ GROUP "/" {
USER_DEFINED_FILTER {
FILTER_ID 260
COMMENT dynlib4
PARAMS { 9 1 11 2 }
PARAMS { 9 1 10 3 }
}
}
FILLVALUE {
@ -55,7 +55,7 @@ GROUP "/" {
USER_DEFINED_FILTER {
FILTER_ID 260
COMMENT dynlib4
PARAMS { 9 1 11 2 }
PARAMS { 9 1 10 3 }
}
}
FILLVALUE {
@ -77,7 +77,7 @@ GROUP "/" {
USER_DEFINED_FILTER {
FILTER_ID 260
COMMENT dynlib4
PARAMS { 9 1 11 2 }
PARAMS { 9 1 10 3 }
}
}
FILLVALUE {
@ -99,7 +99,7 @@ GROUP "/" {
USER_DEFINED_FILTER {
FILTER_ID 260
COMMENT dynlib4
PARAMS { 9 1 11 2 }
PARAMS { 9 1 10 3 }
}
}
FILLVALUE {
@ -121,7 +121,7 @@ GROUP "/" {
USER_DEFINED_FILTER {
FILTER_ID 260
COMMENT dynlib4
PARAMS { 9 1 11 2 }
PARAMS { 9 1 10 3 }
}
}
FILLVALUE {
@ -143,7 +143,7 @@ GROUP "/" {
USER_DEFINED_FILTER {
FILTER_ID 260
COMMENT dynlib4
PARAMS { 9 1 11 2 }
PARAMS { 9 1 10 3 }
}
}
FILLVALUE {