From 13edfb217585eee6fe9f9f20d0b3198c1bb5af98 Mon Sep 17 00:00:00 2001 From: Raymond Lu Date: Fri, 18 Feb 2011 15:18:01 -0500 Subject: [svn-r20125] 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. The changes to configture.in, tools/misc, tools/lib, config, c++/test, Makefile.am, and fortran are only property changes when I merged from the trunk. Tested on jam. But I tested the same fix in the trunk with h5committest. --- release_docs/RELEASE.txt | 4 ++- src/H5T.c | 7 ++++- test/dtypes.c | 82 +++++++++++++++++++++++++++++++++++++++++------- 3 files changed, 80 insertions(+), 13 deletions(-) diff --git a/release_docs/RELEASE.txt b/release_docs/RELEASE.txt index 2871ac4..f842c34 100644 --- a/release_docs/RELEASE.txt +++ b/release_docs/RELEASE.txt @@ -112,7 +112,9 @@ Bug Fixes since HDF5-1.8.6 Library ------- - - None + - 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) Parallel Library ---------------- 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 cbf5fa9..c4871d1 100644 --- a/test/dtypes.c +++ b/test/dtypes.c @@ -4901,6 +4901,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 @@ -5329,37 +5333,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; -- cgit v0.12