summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonathan Kim <jkm@hdfgroup.org>2012-08-15 16:04:26 (GMT)
committerJonathan Kim <jkm@hdfgroup.org>2012-08-15 16:04:26 (GMT)
commit231fc4d7818c037844aa8adb9f514da8e6c37fa9 (patch)
treee92f8eb7e6f2217c1808bd9dd00f1da9adfa1a2c
parentd27ec1d3bd4740d7d962f26da9b2a19a27592273 (diff)
downloadhdf5-231fc4d7818c037844aa8adb9f514da8e6c37fa9.zip
hdf5-231fc4d7818c037844aa8adb9f514da8e6c37fa9.tar.gz
hdf5-231fc4d7818c037844aa8adb9f514da8e6c37fa9.tar.bz2
[svn-r22684] Purpose:
Address HDFFV-7942 - h5diff: incorrect result for comparing attribute data with different type size in same class Description: When comparing attribute data values with same type class but different size, the result was incorrect. It was due to the size difference and got truncated. Fixed to match up the smaller type size to big type size like what dataset does. Tested: jam (linux32-LE), koala (linux64-LE), ostrich (linuxppc64-BE), tejeda (mac32-LE), linew (solaris-BE), Windows (32-LE cmake), cmake (jam)
-rw-r--r--MANIFEST1
-rw-r--r--release_docs/RELEASE.txt3
-rw-r--r--tools/h5diff/CMakeLists.txt7
-rw-r--r--tools/h5diff/h5diffgentest.c17
-rw-r--r--tools/h5diff/testfiles/h5diff_59.txt11
-rw-r--r--tools/h5diff/testfiles/h5diff_dtypes.h5bin10776 -> 11416 bytes
-rwxr-xr-xtools/h5diff/testh5diff.sh5
-rw-r--r--tools/lib/h5diff.h5
-rw-r--r--tools/lib/h5diff_attr.c8
-rw-r--r--tools/lib/h5diff_dset.c24
-rw-r--r--tools/lib/h5diff_util.c42
11 files changed, 103 insertions, 20 deletions
diff --git a/MANIFEST b/MANIFEST
index 2659d0e..9cd670d 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -1815,6 +1815,7 @@
./tools/h5diff/testfiles/h5diff_56.txt
./tools/h5diff/testfiles/h5diff_57.txt
./tools/h5diff/testfiles/h5diff_58.txt
+./tools/h5diff/testfiles/h5diff_59.txt
./tools/h5diff/testfiles/h5diff_600.txt
./tools/h5diff/testfiles/h5diff_601.txt
./tools/h5diff/testfiles/h5diff_603.txt
diff --git a/release_docs/RELEASE.txt b/release_docs/RELEASE.txt
index fd94005..9d1b28a 100644
--- a/release_docs/RELEASE.txt
+++ b/release_docs/RELEASE.txt
@@ -705,6 +705,9 @@ Bug Fixes since HDF5-1.8.0 release
Tools
-----
+ - h5diff: Fixed the incorrect result when comparing attribute data
+ values and the data type has same class but different size.
+ HDFFV-7942 (JKM 08/15/2012)
- ph5diff: Fixed intermittent hang issue on a certain operation in
parallel mode. It was detected by daily test for comparing
non-comparable objects, but it could have occurred in other
diff --git a/tools/h5diff/CMakeLists.txt b/tools/h5diff/CMakeLists.txt
index 3357b97..903564f 100644
--- a/tools/h5diff/CMakeLists.txt
+++ b/tools/h5diff/CMakeLists.txt
@@ -202,6 +202,7 @@ IF (BUILD_TESTING)
${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_56.txt
${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_57.txt
${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_58.txt
+ ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_59.txt
${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_500.txt
${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_501.txt
${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_502.txt
@@ -702,6 +703,8 @@ IF (BUILD_TESTING)
h5diff_57.out.err
h5diff_58.out
h5diff_58.out.err
+ h5diff_59.out
+ h5diff_59.out.err
h5diff_500.out
h5diff_500.out.err
h5diff_501.out
@@ -960,6 +963,10 @@ ADD_H5_TEST (h5diff_57 0 -v ${FILE4} ${FILE4} dset7a dset7b)
# 5.8 (region reference)
ADD_H5_TEST (h5diff_58 1 -v ${FILE7} ${FILE8} refreg)
+# test for both dset and attr with same type but with different size
+# ( HDDFV-7942 )
+ADD_H5_TEST (h5diff_59 0 -v ${FILE4} ${FILE4} dset11a dset11b)
+
# ##############################################################################
# # Error messages
# ##############################################################################
diff --git a/tools/h5diff/h5diffgentest.c b/tools/h5diff/h5diffgentest.c
index c370f79..a1bf0b5 100644
--- a/tools/h5diff/h5diffgentest.c
+++ b/tools/h5diff/h5diffgentest.c
@@ -759,6 +759,7 @@ int test_datatypes(const char *fname)
{
hid_t fid1;
+ hid_t dset;
hsize_t dims[2]={3,2};
herr_t status;
char buf1a[3][2] = {{1,1},{1,1},{1,1}};
@@ -790,6 +791,9 @@ int test_datatypes(const char *fname)
unsigned int buf10a[3][2] = {{UIMAX,1},{1,1},{1,1}};
unsigned int buf10b[3][2] = {{UIMAX-1,1},{3,4},{5,6}};
+ unsigned short buf11a[3][2] = {{204,205},{2,3},{1,1}};
+ unsigned int buf11b[3][2] = {{204,205},{2,3},{1,1}};
+
/*-------------------------------------------------------------------------
* Create a file
@@ -880,6 +884,19 @@ int test_datatypes(const char *fname)
write_dset(fid1,2,dims,"dset10a",H5T_NATIVE_UINT,buf10a);
write_dset(fid1,2,dims,"dset10b",H5T_NATIVE_UINT,buf10b);
+ /*-------------------------------------------------------------------------
+ * Same type class, different size
+ *-------------------------------------------------------------------------
+ */
+ write_dset(fid1,2,dims,"dset11a",H5T_STD_U16LE,buf11a);
+ dset=H5Dopen (fid1, "dset11a", H5P_DEFAULT);
+ write_attr(dset,2,dims,"attr",H5T_STD_U16LE,buf11a);
+ H5Dclose (dset);
+
+ write_dset(fid1,2,dims,"dset11b",H5T_STD_U32LE,buf11b);
+ dset=H5Dopen (fid1, "dset11b", H5P_DEFAULT);
+ write_attr(dset,2,dims,"attr",H5T_STD_U32LE,buf11b);
+ H5Dclose (dset);
/*-------------------------------------------------------------------------
* Close
diff --git a/tools/h5diff/testfiles/h5diff_59.txt b/tools/h5diff/testfiles/h5diff_59.txt
new file mode 100644
index 0000000..aeefa3a
--- /dev/null
+++ b/tools/h5diff/testfiles/h5diff_59.txt
@@ -0,0 +1,11 @@
+dataset: </dset11a> and </dset11b>
+Warning: different storage datatype
+</dset11a> has file datatype H5T_STD_U16LE
+</dset11b> has file datatype H5T_STD_U32LE
+Warning: different storage datatype
+<attr> has file datatype H5T_STD_U16LE
+<attr> has file datatype H5T_STD_U32LE
+attribute: <attr of </dset11a>> and <attr of </dset11b>>
+0 differences found
+0 differences found
+EXIT CODE: 0
diff --git a/tools/h5diff/testfiles/h5diff_dtypes.h5 b/tools/h5diff/testfiles/h5diff_dtypes.h5
index 7c3cd9d..ffa5264 100644
--- a/tools/h5diff/testfiles/h5diff_dtypes.h5
+++ b/tools/h5diff/testfiles/h5diff_dtypes.h5
Binary files differ
diff --git a/tools/h5diff/testh5diff.sh b/tools/h5diff/testh5diff.sh
index 7e95e80..db37f24 100755
--- a/tools/h5diff/testh5diff.sh
+++ b/tools/h5diff/testh5diff.sh
@@ -234,6 +234,7 @@ $SRC_H5DIFF_TESTFILES/h5diff_55.txt
$SRC_H5DIFF_TESTFILES/h5diff_56.txt
$SRC_H5DIFF_TESTFILES/h5diff_57.txt
$SRC_H5DIFF_TESTFILES/h5diff_58.txt
+$SRC_H5DIFF_TESTFILES/h5diff_59.txt
$SRC_H5DIFF_TESTFILES/h5diff_500.txt
$SRC_H5DIFF_TESTFILES/h5diff_501.txt
$SRC_H5DIFF_TESTFILES/h5diff_502.txt
@@ -626,6 +627,10 @@ TOOLTEST h5diff_57.txt -v h5diff_dtypes.h5 h5diff_dtypes.h5 dset7a dset7b
# 5.8 (region reference)
TOOLTEST h5diff_58.txt -v h5diff_dset1.h5 h5diff_dset2.h5 refreg
+# test for both dset and attr with same type but with different size
+# ( HDDFV-7942 )
+TOOLTEST h5diff_59.txt -v h5diff_dtypes.h5 h5diff_dtypes.h5 dset11a dset11b
+
# ##############################################################################
# # Error messages
# ##############################################################################
diff --git a/tools/lib/h5diff.h b/tools/lib/h5diff.h
index f05d0de..2530805 100644
--- a/tools/lib/h5diff.h
+++ b/tools/lib/h5diff.h
@@ -180,6 +180,7 @@ hsize_t diff_attr(hid_t loc1_id,
*-------------------------------------------------------------------------
*/
+/* in h5diff_util.c */
void print_found(hsize_t nfound);
void print_type(hid_t type);
const char* diff_basename(const char *name);
@@ -187,6 +188,10 @@ const char* get_type(h5trav_type_t type);
const char* get_class(H5T_class_t tclass);
const char* get_sign(H5T_sign_t sign);
void print_dimensions (int rank, hsize_t *dims);
+herr_t match_up_memsize (hid_t f_tid1_id, hid_t f_tid2_id,
+ hid_t *m_tid1, hid_t *m_tid2,
+ size_t *m_size1, size_t *m_size2);
+/* in h5diff.c */
int print_objname(diff_opt_t *options, hsize_t nfound);
void do_print_objname (const char *OBJ, const char *path1, const char *path2, diff_opt_t * opts);
void do_print_attrname (const char *attr, const char *path1, const char *path2);
diff --git a/tools/lib/h5diff_attr.c b/tools/lib/h5diff_attr.c
index 85cd01f..144159a 100644
--- a/tools/lib/h5diff_attr.c
+++ b/tools/lib/h5diff_attr.c
@@ -405,6 +405,14 @@ hsize_t diff_attr(hid_t loc1_id,
continue;
}
+ /*-----------------------------------------------------------------
+ * "upgrade" the smaller memory size
+ *------------------------------------------------------------------
+ */
+ if (FAIL == match_up_memsize (ftype1_id, ftype2_id,
+ &mtype1_id, &mtype2_id,
+ &msize1, &msize2))
+ goto error;
/*---------------------------------------------------------------------
* read
diff --git a/tools/lib/h5diff_dset.c b/tools/lib/h5diff_dset.c
index da58cde..f9c7d1c 100644
--- a/tools/lib/h5diff_dset.c
+++ b/tools/lib/h5diff_dset.c
@@ -368,26 +368,10 @@ hsize_t diff_datasetid( hid_t did1,
*/
h5difftrace("upgrade the smaller memory size?\n");
- if(m_size1 != m_size2) {
- h5difftrace("m_size1 != m_size2\n");
- if(m_size1 < m_size2) {
- H5Tclose(m_tid1);
-
- if((m_tid1 = h5tools_get_native_type(f_tid2)) < 0)
- goto error;
-
- m_size1 = H5Tget_size(m_tid1);
- } /* end if */
- else {
- H5Tclose(m_tid2);
-
- if((m_tid2 = h5tools_get_native_type(f_tid1)) < 0)
- goto error;
-
- m_size2 = H5Tget_size(m_tid2);
- } /* end else */
- } /* end if */
- HDassert(m_size1 == m_size2);
+ if (FAIL == match_up_memsize (f_tid1, f_tid2,
+ &m_tid1, &m_tid2,
+ &m_size1, &m_size2))
+ goto error;
/* print names */
if(obj1_name)
diff --git a/tools/lib/h5diff_util.c b/tools/lib/h5diff_util.c
index 0d476b6..aefd641 100644
--- a/tools/lib/h5diff_util.c
+++ b/tools/lib/h5diff_util.c
@@ -311,4 +311,46 @@ void print_found(hsize_t nfound)
}
+/*-----------------------------------------------------------------
+ * Function: match_up_memsize
+ *
+ * Purpose: match smaller memory size up to bigger memory size
+ *------------------------------------------------------------------
+ */
+herr_t match_up_memsize (hid_t f_tid1_id, hid_t f_tid2_id,
+ hid_t *m_tid1, hid_t *m_tid2,
+ size_t *m_size1, size_t *m_size2)
+{
+ herr_t ret = SUCCEED;
+
+ if( (*m_size1) != (*m_size2) )
+ {
+ if( (*m_size1) < (*m_size2) )
+ {
+ H5Tclose( *m_tid1 );
+
+ if(( (*m_tid1) = h5tools_get_native_type(f_tid2_id)) < 0)
+ {
+ ret = FAIL;
+ goto out;
+ }
+
+ *m_size1 = H5Tget_size( *m_tid1 );
+ } /* end if */
+ else {
+ H5Tclose(*m_tid2);
+ if(( (*m_tid2) = h5tools_get_native_type(f_tid1_id)) < 0)
+ {
+ ret = FAIL;
+ goto out;
+ }
+
+ *m_size2 = H5Tget_size(*m_tid2);
+ } /* end else */
+ } /* end if */
+ HDassert( (*m_size1) == (*m_size2) );
+
+out:
+ return ret;
+}