summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeil Fortner <nfortne2@hdfgroup.org>2009-01-14 15:30:51 (GMT)
committerNeil Fortner <nfortne2@hdfgroup.org>2009-01-14 15:30:51 (GMT)
commit6564dbcfaa09da479cc5e393693799e329fc1330 (patch)
tree820621ac55441e10978dca5aa155e170ccebc6b4
parenta365f0e6aabfa6a13b008e0263e6a2d6c86d5d7e (diff)
downloadhdf5-6564dbcfaa09da479cc5e393693799e329fc1330.zip
hdf5-6564dbcfaa09da479cc5e393693799e329fc1330.tar.gz
hdf5-6564dbcfaa09da479cc5e393693799e329fc1330.tar.bz2
[svn-r16308] Purpose: Fix problem with H5Tpack
Description: If a compound type was packed except for some extra space at the end, H5Tpack would not modify the type and the extra space would remain. Changed H5T_is_packed to fix this behaviour. Tested: jam, smirom (h5committest - linew down)
-rw-r--r--release_docs/RELEASE.txt16
-rw-r--r--src/H5Tcompound.c9
-rw-r--r--test/dtypes.c126
3 files changed, 140 insertions, 11 deletions
diff --git a/release_docs/RELEASE.txt b/release_docs/RELEASE.txt
index 51320d0..45457d8 100644
--- a/release_docs/RELEASE.txt
+++ b/release_docs/RELEASE.txt
@@ -141,40 +141,42 @@ Bug Fixes since HDF5-1.8.0 release
Library
-------
+ - Fixed a bug where H5Tpack wouldn't remove trailing space from an
+ otherwise packed compound type. (NAF - 2009/01/14)
- Fixed up some old v2 btree assertions that get run in debug mode that
were previously failing on compilation, and removed some of the
more heavily outdated and non-rewritable ones. (MAM - 2008/12/15)
- Fixed a bug that could cause problems when "automatically" unmounting
- multiple files. (NAF - 2008/11/17)
+ multiple files. (NAF - 2008/11/17)
- H5Ovisit and H5Ovisit_by_name will now properly terminate when the
callback function returns a positive value on the starting object.
(NAF - 2008/11/03)
- Fixed an error where a null message could be created that was larger
- than could be written to the file. (NAF - 2008/10/23)
+ than could be written to the file. (NAF - 2008/10/23)
- Corrected error with family/split/multi VFD not updating driver info
when "latest" version of the file format used. (QAK - 2008/10/14)
- Corrected alignment+threshold errors to work correctly when metadata
aggregation is enabled. (QAK - 2008/10/06)
- Changed H5Fget_obj_count and H5Fget_obj_ids to ignore objects registered
- by the library for internal library use. (NAF - 2008/10/06)
+ by the library for internal library use. (NAF - 2008/10/06)
- Fixed potential memory leak during compound conversion.
(NAF - 2008/10/06)
- Changed the return value of H5Fget_obj_count from INT to SSIZE_T. Also
changed the return value of H5Fget_obj_ids from HERR_T to SSIZE_T and
the type of the parameter MAX_OBJS from INT to SIZE_T. (SLU - 2008/09/26)
- Fixed an issue that could cause data to be improperly overwritten
- during compound type conversion. (NAF - 2008/09/19)
+ during compound type conversion. (NAF - 2008/09/19)
- Fixed pointer alignment violations that could occur during vlen
- conversion. (NAF - 2008/09/16)
+ conversion. (NAF - 2008/09/16)
- Fixed problem where library could cause a segmentation fault when
an invalid location ID was given to H5Giterate(). (QAK - 2008/08/19)
- Fixed improper shutdown when objects have reference count > 1. The
library now tracks reference count due to the application separately
- from that due to internal library routines. (NAF - 2008/08/19)
+ from that due to internal library routines. (NAF - 2008/08/19)
- Fixed assertion failure caused by incorrect array datatype version.
(NAF - 2008/08/08)
- Fixed an issue where mount point traversal would fail when using
- multiple handles for the child. (NAF - 2008/08/07)
+ multiple handles for the child. (NAF - 2008/08/07)
- Fixed an issue where mount points were inaccessible when using multiple
file handles for the parent. The mount table is now in the shared
file structure (the parent pointer is still in the top structure).
diff --git a/src/H5Tcompound.c b/src/H5Tcompound.c
index d9b5974..68de174 100644
--- a/src/H5Tcompound.c
+++ b/src/H5Tcompound.c
@@ -631,8 +631,13 @@ H5T_is_packed(const H5T_t *dt)
dt = dt->shared->parent;
/* If this is a compound datatype, check if it is packed */
- if(dt->shared->type == H5T_COMPOUND)
- ret_value = (htri_t)dt->shared->u.compnd.packed;
+ if(dt->shared->type == H5T_COMPOUND) {
+ H5T_compnd_t *compnd = &(dt->shared->u.compnd); /* Convenience pointer to compound info */
+ ret_value = (htri_t)(compnd->packed
+ && compnd->memb[compnd->nmembs - 1].offset
+ + compnd->memb[compnd->nmembs - 1].size
+ == dt->shared->size);
+ }
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5T_is_packed() */
diff --git a/test/dtypes.c b/test/dtypes.c
index f5bc930..3aad1a7 100644
--- a/test/dtypes.c
+++ b/test/dtypes.c
@@ -2958,8 +2958,6 @@ test_compound_16(void)
} cmpd_struct;
cmpd_struct wdata1 = {1254, 5471};
- cmpd_struct rdata;
- int wdata2[2] = {1, 2};
int obj_count;
hid_t file;
hid_t cmpd_m_tid, cmpd_f_tid, int_id;
@@ -3026,6 +3024,129 @@ error:
/*-------------------------------------------------------------------------
+ * Function: test_compound_17
+ *
+ * Purpose: Tests that compound types are packed correctly when they
+ * only have extra space at the end. The compounds are
+ * "hidden" inside arrays to make sure that they are still
+ * detected correctly.
+ *
+ * Return: Success: 0
+ *
+ * Failure: number of errors
+ *
+ * Programmer: Neil Fortner
+ * Tuesday, January 13, 2009
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+test_compound_17(void)
+{
+ hid_t file;
+ hid_t cmpd_int, arr_int, cmpd_ext, arr_ext, tmp_dt;
+ hsize_t dims[1] = {2};
+ char filename[1024];
+
+ TESTING("that H5Tpack removes trailing bytes");
+
+ /* Create inner compound datatype. This type will be "packed" according
+ * to the internal field, but will have trailing space at the end. */
+ if((cmpd_int = H5Tcreate(H5T_COMPOUND, 4)) < 0) TEST_ERROR
+ if(H5Tinsert(cmpd_int, "c", 0, H5T_NATIVE_CHAR) < 0) TEST_ERROR
+
+ /* Create inner array datatype */
+ if((arr_int = H5Tarray_create2(cmpd_int, 1, dims)) < 0) TEST_ERROR
+
+ /* Create outer compound datatype. This type will be truly packed, with no
+ * trailing space. However, the internal compound contained within is not
+ * packed. */
+ if((cmpd_ext = H5Tcreate(H5T_COMPOUND, 8)) < 0) TEST_ERROR
+ if(H5Tinsert(cmpd_ext, "arr", 0, arr_int) < 0) TEST_ERROR
+
+ /* Create outer array datatype */
+ if((arr_ext = H5Tarray_create2(cmpd_ext, 1, dims)) < 0) TEST_ERROR
+
+ /* Try packing the internal array. Size should be 2 after packing. */
+ if((tmp_dt = H5Tcopy(arr_int)) < 0) TEST_ERROR
+ if(H5Tpack(tmp_dt) < 0) TEST_ERROR
+ if(2 != H5Tget_size(tmp_dt)) {
+ H5_FAILED(); AT();
+ printf(" Size after packing: %d; expected: 2\n", H5Tget_size(tmp_dt));
+ goto error;
+ }
+ if(H5Tclose(tmp_dt) < 0) TEST_ERROR
+
+ /* Try packing the external array. Size should be 4 after packing. */
+ if((tmp_dt = H5Tcopy(arr_ext)) < 0) TEST_ERROR
+ if(H5Tpack(tmp_dt) < 0) TEST_ERROR
+ if(4 != H5Tget_size(tmp_dt)) {
+ H5_FAILED(); AT();
+ printf(" Size after packing: %d; expected: 4\n", H5Tget_size(tmp_dt));
+ goto error;
+ }
+ if(H5Tclose(tmp_dt) < 0) TEST_ERROR
+
+ /* Now we will commit arr_int and arr_ext to a file, and verify that they
+ * are still packed correctly after opening them from the file */
+ /* Create File */
+ h5_fixname(FILENAME[3], H5P_DEFAULT, filename, sizeof filename);
+ if((file=H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR
+
+ /* Commit the datatypes. Note that they are still unpacked. */
+ if(H5Tcommit2(file, "arr_int", arr_int, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT) < 0) TEST_ERROR
+ if(H5Tcommit2(file, "arr_ext", arr_ext, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT) < 0) TEST_ERROR
+
+ /* Close IDs */
+ if(H5Tclose(cmpd_int) < 0) TEST_ERROR
+ if(H5Tclose(arr_int) < 0) TEST_ERROR
+ if(H5Tclose(cmpd_ext) < 0) TEST_ERROR
+ if(H5Tclose(arr_ext) < 0) TEST_ERROR
+ if(H5Fclose(file) < 0) TEST_ERROR
+
+ /* Reopen file */
+ if((file = H5Fopen(filename, H5F_ACC_RDONLY, H5P_DEFAULT)) < 0) TEST_ERROR
+
+ /* Open committed array datatypes */
+ if((arr_int = H5Topen2(file, "arr_int", H5P_DEFAULT)) < 0) TEST_ERROR
+ if((arr_ext = H5Topen2(file, "arr_ext", H5P_DEFAULT)) < 0) TEST_ERROR
+
+ /* Try packing the internal array. Size should be 2 after packing. */
+ if((tmp_dt = H5Tcopy(arr_int)) < 0) TEST_ERROR
+ if(H5Tpack(tmp_dt) < 0) TEST_ERROR
+ if(2 != H5Tget_size(tmp_dt)) {
+ H5_FAILED(); AT();
+ printf(" Size after packing: %d; expected: 2\n", H5Tget_size(tmp_dt));
+ goto error;
+ }
+ if(H5Tclose(tmp_dt) < 0) TEST_ERROR
+
+ /* Try packing the external array. Size should be 4 after packing. */
+ if((tmp_dt = H5Tcopy(arr_ext)) < 0) TEST_ERROR
+ if(H5Tpack(tmp_dt) < 0) TEST_ERROR
+ if(4 != H5Tget_size(tmp_dt)) {
+ H5_FAILED(); AT();
+ printf(" Size after packing: %d; expected: 4\n", H5Tget_size(tmp_dt));
+ goto error;
+ }
+ if(H5Tclose(tmp_dt) < 0) TEST_ERROR
+
+ /* Close IDs */
+ if(H5Tclose(arr_int) < 0) TEST_ERROR
+ if(H5Tclose(arr_ext) < 0) TEST_ERROR
+ if(H5Fclose(file) < 0) TEST_ERROR
+
+ PASSED();
+ return 0;
+
+error:
+ return 1;
+} /* end test_compound_17() */
+
+
+/*-------------------------------------------------------------------------
* Function: test_query
*
* Purpose: Tests query functions of compound and enumeration types.
@@ -5719,6 +5840,7 @@ main(void)
nerrors += test_compound_14();
nerrors += test_compound_15();
nerrors += test_compound_16();
+ nerrors += test_compound_17();
nerrors += test_conv_enum_1();
nerrors += test_conv_enum_2();
nerrors += test_conv_bitfield();