summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRaymond Lu <songyulu@hdfgroup.org>2011-02-18 19:01:34 (GMT)
committerRaymond Lu <songyulu@hdfgroup.org>2011-02-18 19:01:34 (GMT)
commit4f75c8c24bea54dcbdc64fbcbf7c77b8ae797c61 (patch)
tree4fe0ae2bd3daee51e0240e7fe0926987e14af1e6
parent40d2ecb45f317bf2a91fbf937e8cc11c45d9898b (diff)
downloadhdf5-4f75c8c24bea54dcbdc64fbcbf7c77b8ae797c61.zip
hdf5-4f75c8c24bea54dcbdc64fbcbf7c77b8ae797c61.tar.gz
hdf5-4f75c8c24bea54dcbdc64fbcbf7c77b8ae797c61.tar.bz2
[svn-r20121] Bug 1586 - the datatype handler created with H5Tencode/decode had the reference count 0. I fixed it by changing the APP_REF parameter of H5I_register from FALSE to TRUE and added a test case in dtypes.c.
Tested on jam, heiwa, and amani.
-rw-r--r--release_docs/RELEASE.txt3
-rw-r--r--src/H5T.c7
-rw-r--r--test/dtypes.c82
3 files changed, 80 insertions, 12 deletions
diff --git a/release_docs/RELEASE.txt b/release_docs/RELEASE.txt
index 8f437b3..bf96077 100644
--- a/release_docs/RELEASE.txt
+++ b/release_docs/RELEASE.txt
@@ -264,6 +264,9 @@ Bug Fixes since HDF5-1.8.0 release
Library
-------
+ - The datatype handler created with H5Tencode/decode used to have the
+ reference count 0 (zero). I have fixed it. It is 1 (one) now.
+ (SLU - 2011/2/18)
- Fixed a bug that caused big endian machines to generate corrupt files
when using the scale-offset filter with floating point data or
fill values. Note that such datasets will no longer be readable
diff --git a/src/H5T.c b/src/H5T.c
index 1f962f0..25b241b 100644
--- a/src/H5T.c
+++ b/src/H5T.c
@@ -2807,6 +2807,11 @@ done:
* slu@ncsa.uiuc.edu
* July 14, 2004
*
+ * Modification:Raymond Lu
+ * songyulu@hdfgroup.org
+ * 17 February 2011
+ * I changed the value for the APP_REF parameter of H5I_register
+ * from FALSE to TRUE.
*-------------------------------------------------------------------------
*/
hid_t
@@ -2827,7 +2832,7 @@ H5Tdecode(const void *buf)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTDECODE, FAIL, "can't decode object")
/* Register the type and return the ID */
- if((ret_value = H5I_register(H5I_DATATYPE, dt, FALSE)) < 0)
+ if((ret_value = H5I_register(H5I_DATATYPE, dt, TRUE)) < 0)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, FAIL, "unable to register data type")
done:
diff --git a/test/dtypes.c b/test/dtypes.c
index 0a3b6e4..655472c 100644
--- a/test/dtypes.c
+++ b/test/dtypes.c
@@ -4900,6 +4900,10 @@ opaque_funcs(void)
* Modifications: Raymond Lu
* July 13, 2009
* Added the test for VL string types.
+ *
+ * Raymond Lu
+ * 17 February 2011
+ * I added the test of reference count for decoded datatypes.
*-------------------------------------------------------------------------
*/
static int
@@ -5328,37 +5332,93 @@ test_encode(void)
} /* end if */
/*-----------------------------------------------------------------------
- * Close and release
+ * Test the reference count of the decoded datatypes
*-----------------------------------------------------------------------
*/
- /* Close datatype and file */
- if(H5Tclose(tid1) < 0) {
+
+ /* Make sure the reference counts for the decoded datatypes are one. */
+ if(H5Iget_ref(decoded_tid1) != 1) {
H5_FAILED();
- printf("Can't close datatype\n");
+ printf("Decoded datatype has incorrect reference count\n");
goto error;
} /* end if */
- if(H5Tclose(tid2) < 0) {
+
+ if(H5Iget_ref(decoded_tid2) != 1) {
H5_FAILED();
- printf("Can't close datatype\n");
+ printf("Decoded datatype has incorrect reference count\n");
goto error;
} /* end if */
- if(H5Tclose(tid3) < 0) {
+
+ if(H5Iget_ref(decoded_tid3) != 1) {
H5_FAILED();
- printf("Can't close datatype\n");
+ printf("Decoded datatype has incorrect reference count\n");
goto error;
} /* end if */
- if(H5Tclose(decoded_tid1) < 0) {
+ /* Make sure the reference counts for the decoded datatypes can be
+ * decremented and the datatypes are closed. */
+ if(H5Idec_ref(decoded_tid1) != 0) {
+ H5_FAILED();
+ printf("Decoded datatype can't close\n");
+ goto error;
+ } /* end if */
+
+ if(H5Idec_ref(decoded_tid2) != 0) {
+ H5_FAILED();
+ printf("Decoded datatype can't close\n");
+ goto error;
+ } /* end if */
+
+ if(H5Idec_ref(decoded_tid3) != 0) {
+ H5_FAILED();
+ printf("Decoded datatype can't close\n");
+ goto error;
+ } /* end if */
+
+ /* Make sure the decoded datatypes are already closed. */
+ H5E_BEGIN_TRY {
+ ret = H5Tclose(decoded_tid1);
+ } H5E_END_TRY;
+ if(ret!=FAIL) {
+ H5_FAILED();
+ printf("Decoded datatype should have been closed\n");
+ goto error;
+ }
+
+ H5E_BEGIN_TRY {
+ ret = H5Tclose(decoded_tid2);
+ } H5E_END_TRY;
+ if(ret!=FAIL) {
+ H5_FAILED();
+ printf("Decoded datatype should have been closed\n");
+ goto error;
+ }
+
+ H5E_BEGIN_TRY {
+ ret = H5Tclose(decoded_tid3);
+ } H5E_END_TRY;
+ if(ret!=FAIL) {
+ H5_FAILED();
+ printf("Decoded datatype should have been closed\n");
+ goto error;
+ }
+
+ /*-----------------------------------------------------------------------
+ * Close and release
+ *-----------------------------------------------------------------------
+ */
+ /* Close datatype and file */
+ if(H5Tclose(tid1) < 0) {
H5_FAILED();
printf("Can't close datatype\n");
goto error;
} /* end if */
- if(H5Tclose(decoded_tid2) < 0) {
+ if(H5Tclose(tid2) < 0) {
H5_FAILED();
printf("Can't close datatype\n");
goto error;
} /* end if */
- if(H5Tclose(decoded_tid3) < 0) {
+ if(H5Tclose(tid3) < 0) {
H5_FAILED();
printf("Can't close datatype\n");
goto error;