From b14a4fd95f5c71f31ec344e13a7c398015da41e6 Mon Sep 17 00:00:00 2001 From: Binh-Minh Ribler Date: Sun, 10 Jul 2005 06:26:56 -0500 Subject: [svn-r11060] Purpose: Fix bug (reported by user) Description: The use of FileCreatPropList::DEFAULT sometimes caused failure in the reference counting area. This occurs to all the default property lists, which also include FileAccPropList::DEFAULT, DSetCreatPropList::DEFAULT, and DSetMemXferPropList::DEFAULT. H5P_DEFAULT was used to create these default prop lists and because its value is 0, the id of these prop lists are 0, which is rejected by the H5I functions during the reference counting. Solution: The main action to fix the above problem was to use H5P_FILE_CREATE H5P_FILE_ACCESS H5P_DATASET_CREATE H5P_DATASET_XFER to define the default property lists accordingly. Yet, when this fix was applied, some bug in reference counting was revealed. It appeared that some ids were not incremented but were passed in for decrementing. The following actions were then taken to fix and improve the current use of reference counting H5I functions. * added private func IdComponent::p_valid_id to verify that the id is a valid id and can be passed into an H5I function * used p_valid_id to validate an id before calling an H5I functions in the reference-counting member functions incRefCount, decRefCount, and getCounter * changed to use member function incRefCount, decRefCount, and getCounter instead of the C APIs H5Iinc_ref, H5Idec_ref, and H5Iget_ref throughout IdComponent. In addition, overloadings were added for incRefCount, decRefCount, and getCounter to take an id different than the id of the current instance; they can be convenient during debugging. Platforms tested: Linux 2.4 (heping) SunOS 5.8 64-bit (sol) AIX 5.1 (copper) --- c++/src/H5Attribute.cpp | 10 ++--- c++/src/H5DataSet.cpp | 18 ++++----- c++/src/H5DataSpace.cpp | 8 ++-- c++/src/H5DataType.cpp | 12 +++--- c++/src/H5DcreatProp.cpp | 2 +- c++/src/H5DxferProp.cpp | 2 +- c++/src/H5Exception.cpp | 4 +- c++/src/H5FaccProp.cpp | 2 +- c++/src/H5FcreatProp.cpp | 2 +- c++/src/H5File.cpp | 59 ++++++++++++++-------------- c++/src/H5Group.cpp | 12 +++--- c++/src/H5IdComponent.cpp | 98 +++++++++++++++++++++++++++++++++++++++++------ c++/src/H5IdComponent.h | 21 ++++++++-- c++/src/H5PropList.cpp | 10 ++--- 14 files changed, 173 insertions(+), 87 deletions(-) diff --git a/c++/src/H5Attribute.cpp b/c++/src/H5Attribute.cpp index 515415d..ccfdd4c 100644 --- a/c++/src/H5Attribute.cpp +++ b/c++/src/H5Attribute.cpp @@ -135,7 +135,7 @@ void Attribute::read( const DataType& mem_type, string& strg ) const throw AttributeIException("Attribute::read", "H5Aread failed"); } strg = strg_C; - delete strg_C; + delete []strg_C; } //-------------------------------------------------------------------------- @@ -205,7 +205,7 @@ ssize_t Attribute::getName( size_t buf_size, string& attr_name ) const } // otherwise, convert the C attribute name and return attr_name = name_C; - delete name_C; + delete []name_C; return( name_size ); } @@ -252,7 +252,7 @@ string Attribute::getName() const else attr_name = name_C; - delete name_C; + delete []name_C; return( attr_name ); } @@ -294,8 +294,8 @@ hsize_t Attribute::getStorageSize() const ///\brief Properly terminates access to this attribute. // Programmer Binh-Minh Ribler - 2000 // Modification -// Replaced resetIdComponent with decRefCount to use new ID -// reference counting mechanisms by Quincey Koziol, June 1, 2004 +// Replaced resetIdComponent with decRefCount to use C library +// ID reference counting mechanism - June 1, 2004 //-------------------------------------------------------------------------- Attribute::~Attribute() { diff --git a/c++/src/H5DataSet.cpp b/c++/src/H5DataSet.cpp index 899155d..e617634 100644 --- a/c++/src/H5DataSet.cpp +++ b/c++/src/H5DataSet.cpp @@ -117,7 +117,7 @@ DSetCreatPropList DataSet::getCreatePlist() const //-------------------------------------------------------------------------- // Function: DataSet::getStorageSize -///\brief Returns the amount of storage required for a dataset. +///\brief Returns the amount of storage required for a dataset. ///\return Size of the storage or 0, for no data ///\exception H5::DataSetIException // Note: H5Dget_storage_size returns 0 when there is no data. This @@ -260,7 +260,7 @@ void DataSet::read( string& strg, const DataType& mem_type, const DataSpace& mem // Get the String and clean up strg = strg_C; - delete strg_C; + delete []strg_C; } //-------------------------------------------------------------------------- @@ -413,7 +413,7 @@ void DataSet::fillMemBuf(void *buf, DataType& buf_type, DataSpace& space) ///\param dataspace - IN: Dataspace with selection ///\param ref_type - IN: Type of reference; default to \c H5R_DATASET_REGION ///\return A reference -///\exception H5::ReferenceIException +///\exception H5::IdComponentException // Programmer Binh-Minh Ribler - May, 2004 //-------------------------------------------------------------------------- void* DataSet::Reference(const char* name, DataSpace& dataspace, H5R_type_t ref_type) const @@ -428,7 +428,7 @@ void* DataSet::Reference(const char* name, DataSpace& dataspace, H5R_type_t ref_ /// a reference to an HDF5 object, not to a dataset region. ///\param name - IN: Name of the object to be referenced ///\return A reference -///\exception H5::ReferenceIException +///\exception H5::IdComponentException ///\par Description // This function passes H5R_OBJECT and -1 to the protected // function for it to pass to the C API H5Rcreate @@ -450,7 +450,7 @@ void* DataSet::Reference(const char* name) const // H5G_GROUP Object is a group. // H5G_DATASET Object is a dataset. // H5G_TYPE Object is a named datatype -// Exception H5::ReferenceIException +// Exception H5::IdComponentException // Programmer Binh-Minh Ribler - May, 2004 //-------------------------------------------------------------------------- H5G_obj_t DataSet::getObjType(void *ref, H5R_type_t ref_type) const @@ -465,7 +465,7 @@ H5G_obj_t DataSet::getObjType(void *ref, H5R_type_t ref_type) const /// to H5R_DATASET_REGION ///\param ref - IN: Reference to get region of ///\return DataSpace instance -///\exception H5::ReferenceIException +///\exception H5::IdComponentException // Programmer Binh-Minh Ribler - May, 2004 //-------------------------------------------------------------------------- DataSpace DataSet::getRegion(void *ref, H5R_type_t ref_type) const @@ -497,12 +497,12 @@ void DataSet::close() ///\brief Properly terminates access to this dataset. // Programmer Binh-Minh Ribler - 2000 // Modification -// Replaced resetIdComponent with decRefCount to use new ID -// reference counting mechanisms by Quincey Koziol, June 1, 2004 +// Replaced resetIdComponent with decRefCount to use C library +// ID reference counting mechanism - June 1, 2004 //-------------------------------------------------------------------------- DataSet::~DataSet() { - // The dataset id will be closed properly + // The dataset id will be closed properly try { decRefCount(); } diff --git a/c++/src/H5DataSpace.cpp b/c++/src/H5DataSpace.cpp index a2d1a4e..4a51c6b 100644 --- a/c++/src/H5DataSpace.cpp +++ b/c++/src/H5DataSpace.cpp @@ -94,8 +94,8 @@ DataSpace::DataSpace( const DataSpace& original ) : IdComponent( original ) {} ///\exception H5::DataSpaceIException // Programmer Binh-Minh Ribler - 2000 // Modification -// Replaced resetIdComponent with decRefCount to use new ID -// reference counting mechanisms by Quincey Koziol, June 1, 2004 +// Replaced resetIdComponent with decRefCount to use C library +// ID reference counting mechanism - June 1, 2004 //-------------------------------------------------------------------------- void DataSpace::copy( const DataSpace& like_space ) { @@ -568,8 +568,8 @@ void DataSpace::close() ///\brief Properly terminates access to this dataspace. // Programmer Binh-Minh Ribler - 2000 // Modification -// Replaced resetIdComponent with decRefCount to use new ID -// reference counting mechanisms by Quincey Koziol, June 1, 2004 +// Replaced resetIdComponent with decRefCount to use C library +// ID reference counting mechanism - June 1, 2004 //-------------------------------------------------------------------------- DataSpace::~DataSpace() { diff --git a/c++/src/H5DataType.cpp b/c++/src/H5DataType.cpp index 6e5d584..1d2a519 100644 --- a/c++/src/H5DataType.cpp +++ b/c++/src/H5DataType.cpp @@ -96,7 +96,7 @@ DataType::DataType(const DataType& original) : H5Object(original) // Programmer Binh-Minh Ribler - 2000 // Modification // Replaced resetIdComponent with decRefCount to use C library -// ID reference counting mechanism - BMR, Feb 20, 2005 +// ID reference counting mechanism - June 1, 2004 //-------------------------------------------------------------------------- void DataType::copy( const DataType& like_type ) { @@ -538,7 +538,7 @@ bool DataType::isVariableStr() const ///\param dataspace - IN: Dataspace with selection ///\param ref_type - IN: Type of reference; default to \c H5R_DATASET_REGION ///\return A reference -///\exception H5::ReferenceIException +///\exception H5::IdComponentException // Programmer Binh-Minh Ribler - May, 2004 //-------------------------------------------------------------------------- void* DataType::Reference(const char* name, DataSpace& dataspace, H5R_type_t ref_type) const @@ -553,7 +553,7 @@ void* DataType::Reference(const char* name, DataSpace& dataspace, H5R_type_t ref /// a reference to an HDF5 object, not to a dataset region. ///\param name - IN: Name of the object to be referenced ///\return A reference -///\exception H5::ReferenceIException +///\exception H5::IdComponentException ///\par Description // This function passes H5R_OBJECT and -1 to the protected // function for it to pass to the C API H5Rcreate @@ -575,7 +575,7 @@ void* DataType::Reference(const char* name) const /// \li \c H5G_GROUP Object is a group. /// \li \c H5G_DATASET Object is a dataset. /// \li \c H5G_TYPE Object is a named datatype -///\exception H5::ReferenceIException +///\exception H5::IdComponentException // Programmer Binh-Minh Ribler - May, 2004 //-------------------------------------------------------------------------- H5G_obj_t DataType::getObjType(void *ref, H5R_type_t ref_type) const @@ -589,7 +589,7 @@ H5G_obj_t DataType::getObjType(void *ref, H5R_type_t ref_type) const ///\param ref - IN: Reference to get region of ///\param ref_type - IN: Type of reference to get region of - default ///\return DataSpace instance -///\exception H5::ReferenceIException +///\exception H5::IdComponentException // Programmer Binh-Minh Ribler - May, 2004 //-------------------------------------------------------------------------- DataSpace DataType::getRegion(void *ref, H5R_type_t ref_type) const @@ -628,7 +628,7 @@ void DataType::close() // Programmer Binh-Minh Ribler - 2000 // Modification // Replaced resetIdComponent with decRefCount to use C library -// ID reference counting mechanism - BMR, Feb 20, 2005 +// ID reference counting mechanism - June 1, 2004 //-------------------------------------------------------------------------- DataType::~DataType() { diff --git a/c++/src/H5DcreatProp.cpp b/c++/src/H5DcreatProp.cpp index b5e7288..9ecc9a3 100644 --- a/c++/src/H5DcreatProp.cpp +++ b/c++/src/H5DcreatProp.cpp @@ -30,7 +30,7 @@ namespace H5 { //-------------------------------------------------------------------------- ///\brief Constant for dataset creation default property //-------------------------------------------------------------------------- -const DSetCreatPropList DSetCreatPropList::DEFAULT( H5P_DEFAULT ); +const DSetCreatPropList DSetCreatPropList::DEFAULT; //-------------------------------------------------------------------------- // Function: DSetCreatPropList default constructor diff --git a/c++/src/H5DxferProp.cpp b/c++/src/H5DxferProp.cpp index 14cdbd9..379e02e 100644 --- a/c++/src/H5DxferProp.cpp +++ b/c++/src/H5DxferProp.cpp @@ -27,7 +27,7 @@ namespace H5 { //-------------------------------------------------------------------------- ///\brief Constant for default dataset memory and transfer property list. //-------------------------------------------------------------------------- -const DSetMemXferPropList DSetMemXferPropList::DEFAULT( H5P_DEFAULT ); +const DSetMemXferPropList DSetMemXferPropList::DEFAULT; //-------------------------------------------------------------------------- // Function DSetMemXferPropList default constructor diff --git a/c++/src/H5Exception.cpp b/c++/src/H5Exception.cpp index aef0d9c..37d0da5 100644 --- a/c++/src/H5Exception.cpp +++ b/c++/src/H5Exception.cpp @@ -85,7 +85,7 @@ string Exception::getMajorString( hid_t err_major ) const // Convert the C error description and return string major_str(mesg_C); - delete mesg_C; + delete []mesg_C; return( major_str ); } @@ -121,7 +121,7 @@ string Exception::getMinorString( hid_t err_minor ) const // Convert the C error description and return string minor_str(mesg_C); - delete mesg_C; + delete []mesg_C; return( minor_str ); } diff --git a/c++/src/H5FaccProp.cpp b/c++/src/H5FaccProp.cpp index ec7d7be..7e96bc0 100644 --- a/c++/src/H5FaccProp.cpp +++ b/c++/src/H5FaccProp.cpp @@ -27,7 +27,7 @@ namespace H5 { //-------------------------------------------------------------------------- ///\brief Constant for default property //-------------------------------------------------------------------------- -const FileAccPropList FileAccPropList::DEFAULT( H5P_DEFAULT ); +const FileAccPropList FileAccPropList::DEFAULT; //-------------------------------------------------------------------------- // Function: Default Constructor diff --git a/c++/src/H5FcreatProp.cpp b/c++/src/H5FcreatProp.cpp index 7cafd52..0eb9462 100644 --- a/c++/src/H5FcreatProp.cpp +++ b/c++/src/H5FcreatProp.cpp @@ -27,7 +27,7 @@ namespace H5 { //-------------------------------------------------------------------------- ///\brief Constant for default property //-------------------------------------------------------------------------- -const FileCreatPropList FileCreatPropList::DEFAULT( H5P_DEFAULT ); +const FileCreatPropList FileCreatPropList::DEFAULT; //-------------------------------------------------------------------------- // Function: FileCreatPropList default constructor diff --git a/c++/src/H5File.cpp b/c++/src/H5File.cpp index 1025c41..b9adbca 100644 --- a/c++/src/H5File.cpp +++ b/c++/src/H5File.cpp @@ -119,8 +119,7 @@ void H5File::p_get_file(const char* name, unsigned int flags, const FileCreatPro // Open the file if none of the bits above are set. else { - // use create_plist for access plist because of the default argument - hid_t access_plist_id = create_plist.getId(); + hid_t access_plist_id = access_plist.getId(); id = H5Fopen( name, flags, access_plist_id ); if( id <= 0 ) // throw an exception when open/create fail { @@ -182,11 +181,11 @@ bool H5File::isHdf5(const string& name ) // If this object has represented another HDF5 file, the previous // HDF5 file need to be closed first. // Programmer Binh-Minh Ribler - 2000 +// Note: This wrapper doesn't seem right regarding the 'id' and should +// be investigated. BMR - 2/20/2005 // Modification -// Replaced resetIdComponent with decRefCount to use new ID -// reference counting mechanisms by Quincey Koziol, June 1, 2004 -// Note: This wrapper doesn't seem right regarding the 'id' and should -// be investigated. BMR - 2/20/2005 +// Replaced resetIdComponent with decRefCount to use C library +// ID reference counting mechanism - June 1, 2004 //-------------------------------------------------------------------------- void H5File::reOpen() { @@ -295,15 +294,15 @@ hssize_t H5File::getFreeSpace() const ///\return Number of opened object IDs ///\exception H5::FileIException ///\par Description -/// The valid values for \a types include: -/// \li \c H5F_OBJ_FILE - Files only -/// \li \c H5F_OBJ_DATASET - Datasets only -/// \li \c H5F_OBJ_GROUP - Groups only -/// \li \c H5F_OBJ_DATATYPE - Named datatypes only -/// \li \c H5F_OBJ_ATTR - Attributes only -/// \li \c H5F_OBJ_ALL - All of the above, i.e., \c H5F_OBJ_FILE -/// | \c H5F_OBJ_DATASET | \c H5F_OBJ_GROUP -/// | \c H5F_OBJ_DATATYPE | \c H5F_OBJ_ATTR +/// The valid values for \a types include: +/// \li \c H5F_OBJ_FILE - Files only +/// \li \c H5F_OBJ_DATASET - Datasets only +/// \li \c H5F_OBJ_GROUP - Groups only +/// \li \c H5F_OBJ_DATATYPE - Named datatypes only +/// \li \c H5F_OBJ_ATTR - Attributes only +/// \li \c H5F_OBJ_ALL - All of the above, i.e., \c H5F_OBJ_FILE +/// | \c H5F_OBJ_DATASET | \c H5F_OBJ_GROUP +/// | \c H5F_OBJ_DATATYPE | \c H5F_OBJ_ATTR ///\par /// Multiple object types can be combined with the logical OR operator (|). // Programmer Binh-Minh Ribler - May 2004 @@ -347,15 +346,15 @@ int H5File::getObjCount() const ///\param oid_list - List of open object identifiers ///\exception H5::FileIException ///\par Description -/// The valid values for \a types include: -/// \li \c H5F_OBJ_FILE - Files only -/// \li \c H5F_OBJ_DATASET - Datasets only -/// \li \c H5F_OBJ_GROUP - Groups only -/// \li \c H5F_OBJ_DATATYPE - Named datatypes only -/// \li \c H5F_OBJ_ATTR - Attributes only -/// \li \c H5F_OBJ_ALL - All of the above, i.e., \c H5F_OBJ_FILE -/// | \c H5F_OBJ_DATASET | \c H5F_OBJ_GROUP -/// | \c H5F_OBJ_DATATYPE | \c H5F_OBJ_ATTR +/// The valid values for \a types include: +/// \li \c H5F_OBJ_FILE - Files only +/// \li \c H5F_OBJ_DATASET - Datasets only +/// \li \c H5F_OBJ_GROUP - Groups only +/// \li \c H5F_OBJ_DATATYPE - Named datatypes only +/// \li \c H5F_OBJ_ATTR - Attributes only +/// \li \c H5F_OBJ_ALL - All of the above, i.e., \c H5F_OBJ_FILE +/// | \c H5F_OBJ_DATASET | \c H5F_OBJ_GROUP +/// | \c H5F_OBJ_DATATYPE | \c H5F_OBJ_ATTR ///\par /// Multiple object types can be combined with the logical OR operator (|). // @@ -438,7 +437,7 @@ string H5File::getFileName() const ///\param dataspace - IN: Dataspace with selection ///\param ref_type - IN: Type of reference; default to \c H5R_DATASET_REGION ///\return A reference -///\exception H5::ReferenceIException +///\exception H5::IdComponentException ///\par Description /// Note that name must be an absolute path to the object in the file. // Programmer Binh-Minh Ribler - May, 2004 @@ -455,7 +454,7 @@ void* H5File::Reference(const char* name, DataSpace& dataspace, H5R_type_t ref_t /// a reference to an HDF5 object, not to a dataset region. ///\param name - IN: Name of the object to be referenced ///\return A reference -///\exception H5::ReferenceIException +///\exception H5::IdComponentException ///\par Description // This function passes H5R_OBJECT and -1 to the protected // function for it to pass to the C API H5Rcreate @@ -480,7 +479,7 @@ void* H5File::Reference(const char* name) const /// \li \c H5G_GROUP - Object is a group. /// \li \c H5G_DATASET - Object is a dataset. /// \li \c H5G_TYPE - Object is a named datatype -///\exception H5::ReferenceIException +///\exception H5::IdComponentException // Programmer Binh-Minh Ribler - May, 2004 //-------------------------------------------------------------------------- H5G_obj_t H5File::getObjType(void *ref, H5R_type_t ref_type) const @@ -494,7 +493,7 @@ H5G_obj_t H5File::getObjType(void *ref, H5R_type_t ref_type) const ///\param ref - IN: Reference to get region of ///\param ref_type - IN: Type of reference to get region of - default ///\return DataSpace instance -///\exception H5::ReferenceIException +///\exception H5::IdComponentException // Programmer Binh-Minh Ribler - May, 2004 //-------------------------------------------------------------------------- DataSpace H5File::getRegion(void *ref, H5R_type_t ref_type) const @@ -581,8 +580,8 @@ void H5File::throwException(const string func_name, const string msg) const ///\brief Properly terminates access to this file. // Programmer Binh-Minh Ribler - 2000 // Modification -// Replaced resetIdComponent with decRefCount to use new ID -// reference counting mechanisms by Quincey Koziol, June 1, 2004 +// Replaced resetIdComponent with decRefCount to use C library +// ID reference counting mechanism - June 1, 2004 //-------------------------------------------------------------------------- H5File::~H5File() { diff --git a/c++/src/H5Group.cpp b/c++/src/H5Group.cpp index 50bc87f..384ea1e 100644 --- a/c++/src/H5Group.cpp +++ b/c++/src/H5Group.cpp @@ -81,7 +81,7 @@ Group::Group( const hid_t group_id ) : H5Object( group_id ) {} ///\param dataspace - IN: Dataspace with selection ///\param ref_type - IN: Type of reference; default to \c H5R_DATASET_REGION ///\return A reference -///\exception H5::ReferenceIException +///\exception H5::IdComponentException // Programmer Binh-Minh Ribler - May, 2004 //-------------------------------------------------------------------------- void* Group::Reference(const char* name, DataSpace& dataspace, H5R_type_t ref_type) const @@ -96,7 +96,7 @@ void* Group::Reference(const char* name, DataSpace& dataspace, H5R_type_t ref_ty /// a reference to an HDF5 object, not to a dataset region. ///\param name - IN: Name of the object to be referenced ///\return A reference -///\exception H5::ReferenceIException +///\exception H5::IdComponentException ///\par Description // This function passes H5R_OBJECT and -1 to the protected // function for it to pass to the C API H5Rcreate @@ -118,7 +118,7 @@ void* Group::Reference(const char* name) const // H5G_GROUP Object is a group. // H5G_DATASET Object is a dataset. // H5G_TYPE Object is a named datatype -// Exception H5::ReferenceIException +// Exception H5::IdComponentException // Programmer Binh-Minh Ribler - May, 2004 //-------------------------------------------------------------------------- H5G_obj_t Group::getObjType(void *ref, H5R_type_t ref_type) const @@ -132,7 +132,7 @@ H5G_obj_t Group::getObjType(void *ref, H5R_type_t ref_type) const ///\param ref - IN: Reference to get region of ///\param ref_type - IN: Type of reference to get region of - default ///\return DataSpace instance -///\exception H5::ReferenceIException +///\exception H5::IdComponentException // Programmer Binh-Minh Ribler - May, 2004 //-------------------------------------------------------------------------- DataSpace Group::getRegion(void *ref, H5R_type_t ref_type) const @@ -185,8 +185,8 @@ void Group::throwException(const string func_name, const string msg) const ///\brief Properly terminates access to this group. // Programmer Binh-Minh Ribler - 2000 // Modification -// Replaced resetIdComponent with decRefCount to use new ID -// reference counting mechanisms by Quincey Koziol, June 1, 2004 +// Replaced resetIdComponent with decRefCount to use C library +// ID reference counting mechanism - June 1, 2004 //-------------------------------------------------------------------------- Group::~Group() { diff --git a/c++/src/H5IdComponent.cpp b/c++/src/H5IdComponent.cpp index e4c5305..aed355d 100644 --- a/c++/src/H5IdComponent.cpp +++ b/c++/src/H5IdComponent.cpp @@ -41,35 +41,89 @@ IdComponent::IdComponent(const hid_t h5_id) : id(h5_id) {} IdComponent::IdComponent( const IdComponent& original ) { id = original.id; - H5Iinc_ref(id); // increment number of references to this id + incRefCount(); // increment number of references to this id } //-------------------------------------------------------------------------- // Function: IdComponent::incRefCount -///\brief Increment id reference counter. +///\brief Increment reference counter for a given id. +// Programmer Binh-Minh Ribler - May 2005 +//-------------------------------------------------------------------------- +void IdComponent::incRefCount(hid_t obj_id) const +{ + if (p_valid_id(obj_id)) + if (H5Iinc_ref(obj_id) < 0) + throw IdComponentException("IdComponent::incRefCount", "incrementing object ref count failed"); +} + +//-------------------------------------------------------------------------- +// Function: IdComponent::incRefCount +///\brief Increment reference counter for the id of this object. // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- -void IdComponent::incRefCount() { H5Iinc_ref(id); } +void IdComponent::incRefCount() const +{ + incRefCount(id); +} + +//-------------------------------------------------------------------------- +// Function: IdComponent::decRefCount +///\brief Decrement reference counter for a given id. +// Programmer Binh-Minh Ribler - May 2005 +// Modification: +// Added the check for ref counter to give a little more info +// on why H5Idec_ref fails in some cases - BMR 5/19/2005 +//-------------------------------------------------------------------------- +void IdComponent::decRefCount(hid_t obj_id) const +{ + if (p_valid_id(obj_id)) + if (H5Idec_ref(obj_id) < 0) + if (H5Iget_ref(obj_id) <= 0) + throw IdComponentException("IdComponent::decRefCount", + "object ref count is 0 or negative"); + else + throw IdComponentException("IdComponent::decRefCount", + "decrementing object ref count failed"); +} //-------------------------------------------------------------------------- // Function: IdComponent::decRefCount -///\brief Decrement id reference counter. +///\brief Decrement reference counter for the id of this object. // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- -void IdComponent::decRefCount() +void IdComponent::decRefCount() const { - if(id>0) - if(H5Idec_ref(id)<0) - throw IdComponentException("IdComponent::decRefCount", "decrementing object ref count failed"); + decRefCount(id); } //-------------------------------------------------------------------------- // Function: IdComponent::getCounter -///\brief Returns the reference counter to this identifier. +///\brief Returns the reference counter for a given id. +///\return Reference count +// Programmer Binh-Minh Ribler - May 2005 +//-------------------------------------------------------------------------- +int IdComponent::getCounter(hid_t obj_id) const +{ + int counter = 0; + if (p_valid_id(obj_id)) + { + counter = H5Iget_ref(obj_id); + if (counter < 0) + throw IdComponentException("IdComponent::incRefCount", "incrementing object ref count failed"); + } + return (counter); +} + +//-------------------------------------------------------------------------- +// Function: IdComponent::getCounter +///\brief Returns the reference counter for the id of this object. ///\return Reference count // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- -int IdComponent::getCounter() { return( H5Iget_ref(id)); } +int IdComponent::getCounter() const +{ + return (getCounter(id)); +} //-------------------------------------------------------------------------- // Function: IdComponent::operator= @@ -95,7 +149,7 @@ IdComponent& IdComponent::operator=( const IdComponent& rhs ) id = rhs.id; // increment the reference counter - H5Iinc_ref(id); + incRefCount(); return( *this ); } @@ -210,7 +264,7 @@ string IdComponent::p_get_file_name() const // Convert the C file name and return string file_name(name_C); - delete name_C; + delete []name_C; return(file_name); } @@ -284,6 +338,26 @@ hid_t IdComponent::p_get_region(void *ref, H5R_type_t ref_type) const return(space_id); } +// +// Local functions used in this class +// + +//-------------------------------------------------------------------------- +// Function: p_valid_id +// Purpose: Verifies that the given id is a valid id so it can be passed +// into an H5I C function. +// Return true if id is valid, false, otherwise +// Programmer Binh-Minh Ribler - May, 2005 +//-------------------------------------------------------------------------- +bool IdComponent::p_valid_id(hid_t obj_id) const +{ + H5I_type_t id_type = H5Iget_type(obj_id); + if (id_type <= H5I_BADID || id_type >= H5I_NTYPES) + return false; + else + return true; +} + #endif // DOXYGEN_SHOULD_SKIP_THIS #ifndef H5_NO_NAMESPACE diff --git a/c++/src/H5IdComponent.h b/c++/src/H5IdComponent.h index 45dc2a5..e50eb2a 100644 --- a/c++/src/H5IdComponent.h +++ b/c++/src/H5IdComponent.h @@ -25,18 +25,21 @@ namespace H5 { class H5_DLLCPP IdComponent { public: // Increment reference counter. - void incRefCount(); + void incRefCount(hid_t obj_id) const; + void incRefCount() const; // Decrement reference counter. - void decRefCount(); + void decRefCount(hid_t obj_id) const; + void decRefCount() const; // Get the reference counter to this identifier. - int getCounter(); + int getCounter(hid_t obj_id) const; + int getCounter() const; // Assignment operator. IdComponent& operator=( const IdComponent& rhs ); - void reset(); + //void reset(); // Sets the identifier of this object to a new value. void setId( hid_t new_id ); @@ -50,6 +53,12 @@ class H5_DLLCPP IdComponent { // Gets the value of IdComponent's data member. virtual hid_t getId () const; +#ifndef DOXYGEN_SHOULD_SKIP_THIS + // Pure virtual function for there are various H5*close for the + // subclasses. + virtual void close() = 0; +#endif // DOXYGEN_SHOULD_SKIP_THIS + // Destructor virtual ~IdComponent(); @@ -78,6 +87,10 @@ class H5_DLLCPP IdComponent { // Retrieves a dataspace with the region pointed to selected. hid_t p_get_region(void *ref, H5R_type_t ref_type) const; + + // Verifies that the given id is valid. + bool p_valid_id(hid_t obj_id) const; + #endif // DOXYGEN_SHOULD_SKIP_THIS }; // end class IdComponent diff --git a/c++/src/H5PropList.cpp b/c++/src/H5PropList.cpp index 11595f4..e0d0143 100644 --- a/c++/src/H5PropList.cpp +++ b/c++/src/H5PropList.cpp @@ -87,8 +87,8 @@ PropList::PropList( const hid_t plist_id ) : IdComponent(0) ///\exception H5::PropListIException // Programmer Binh-Minh Ribler - 2000 // Modification -// Replaced resetIdComponent with decRefCount to use new ID -// reference counting mechanisms by Quincey Koziol, June 1, 2004 +// Replaced resetIdComponent with decRefCount to use C library +// ID reference counting mechanism - June 1, 2004 //-------------------------------------------------------------------------- void PropList::copy( const PropList& like_plist ) { @@ -303,7 +303,7 @@ string PropList::getProperty(const char* name) const // Return propety value as a string after deleting temp C-string string prop_strg = string(prop_strg_C); - delete prop_strg_C; + delete []prop_strg_C; return (prop_strg); } //-------------------------------------------------------------------------- @@ -581,8 +581,8 @@ PropList PropList::getClassParent() const ///\brief Properly terminates access to this property list. // Programmer Binh-Minh Ribler - 2000 // Modification -// Replaced resetIdComponent with decRefCount to use new ID -// reference counting mechanisms by Quincey Koziol, June 1, 2004 +// Replaced resetIdComponent with decRefCount to use C library +// ID reference counting mechanism - June 1, 2004 //-------------------------------------------------------------------------- PropList::~PropList() { -- cgit v0.12