From 18fb7d1a78ff488c23ed5e3bec583034176f3bb4 Mon Sep 17 00:00:00 2001 From: Binh-Minh Ribler Date: Fri, 25 Jul 2008 16:51:01 -0500 Subject: [svn-r15407] Purpose: Fix bug Description: Changed all subclasses' setId to protected p_setId and put back setId in IdComponent. p_setId is used in the library where the id provided by a C API passed on to user's application in the form of a C++ API object, which will be destroyed properly, and so p_setId does not call incRefCount. On the other hand, the public version setId is used by other applications, in which the id passed to setId needs to be closed properly by the application, so setId must call incRefCount for the new object to prevent prematurely closing of the id. Platforms tested: Linux 2.6 (kagiso) SunOS 5.10 (linew) FreeBSD (duty) --- c++/src/H5Attribute.cpp | 6 +++--- c++/src/H5Attribute.h | 7 +++++-- c++/src/H5DataSet.cpp | 6 +++--- c++/src/H5DataSet.h | 5 ++++- c++/src/H5DataSpace.cpp | 6 +++--- c++/src/H5DataSpace.h | 5 ++++- c++/src/H5DataType.cpp | 6 +++--- c++/src/H5DataType.h | 5 ++++- c++/src/H5FaccProp.cpp | 2 +- c++/src/H5File.cpp | 6 +++--- c++/src/H5File.h | 7 +++++-- c++/src/H5Group.cpp | 6 +++--- c++/src/H5Group.h | 5 ++++- c++/src/H5IdComponent.cpp | 33 ++++++++++++++++++++++++++++++++- c++/src/H5IdComponent.h | 6 +++++- c++/src/H5Object.cpp | 4 ++-- c++/src/H5PropList.cpp | 6 +++--- c++/src/H5PropList.h | 4 +++- 18 files changed, 90 insertions(+), 35 deletions(-) diff --git a/c++/src/H5Attribute.cpp b/c++/src/H5Attribute.cpp index bdb6276..64993a2 100644 --- a/c++/src/H5Attribute.cpp +++ b/c++/src/H5Attribute.cpp @@ -359,7 +359,7 @@ hid_t Attribute::getId() const } //-------------------------------------------------------------------------- -// Function: Attribute::setId +// Function: Attribute::p_setId ///\brief Sets the identifier of this object to a new value. /// ///\exception H5::IdComponentException when the attempt to close the HDF5 @@ -370,14 +370,14 @@ hid_t Attribute::getId() const // Then the object's id is reset to the new id. // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- -void Attribute::setId(const hid_t new_id) +void Attribute::p_setId(const hid_t new_id) { // handling references to this old id try { close(); } catch (Exception close_error) { - throw AttributeIException("Attribute::setId", close_error.getDetailMsg()); + throw AttributeIException("Attribute::p_setId", close_error.getDetailMsg()); } // reset object's id to the given id id = new_id; diff --git a/c++/src/H5Attribute.h b/c++/src/H5Attribute.h index 49faeea..7d7ca8d 100644 --- a/c++/src/H5Attribute.h +++ b/c++/src/H5Attribute.h @@ -64,13 +64,16 @@ class H5_DLLCPP Attribute : public AbstractDs, public IdComponent { // Default constructor Attribute(); - // Gets/Sets the attribute id. + // Gets the attribute id. virtual hid_t getId() const; - virtual void setId(const hid_t new_id); // Destructor: properly terminates access to this attribute. virtual ~Attribute(); + protected: + // Sets the attribute id. + virtual void p_setId(const hid_t new_id); + private: hid_t id; // HDF5 attribute id diff --git a/c++/src/H5DataSet.cpp b/c++/src/H5DataSet.cpp index 5ee84b1..3051e08 100644 --- a/c++/src/H5DataSet.cpp +++ b/c++/src/H5DataSet.cpp @@ -534,7 +534,7 @@ hid_t DataSet::getId() const } //-------------------------------------------------------------------------- -// Function: DataSet::setId +// Function: DataSet::p_setId ///\brief Sets the identifier of this object to a new value. /// ///\exception H5::IdComponentException when the attempt to close the HDF5 @@ -545,14 +545,14 @@ hid_t DataSet::getId() const // Then the object's id is reset to the new id. // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- -void DataSet::setId(const hid_t new_id) +void DataSet::p_setId(const hid_t new_id) { // handling references to this old id try { close(); } catch (Exception close_error) { - throw DataSetIException(inMemFunc("setId"), close_error.getDetailMsg()); + throw DataSetIException(inMemFunc("p_setId"), close_error.getDetailMsg()); } // reset object's id to the given id id = new_id; diff --git a/c++/src/H5DataSet.h b/c++/src/H5DataSet.h index f968932..f5d13d0 100644 --- a/c++/src/H5DataSet.h +++ b/c++/src/H5DataSet.h @@ -99,7 +99,6 @@ class H5_DLLCPP DataSet : public H5Object, public AbstractDs { // Gets the dataset id. virtual hid_t getId() const; - virtual void setId(const hid_t new_id); // Destructor: properly terminates access to this dataset. virtual ~DataSet(); @@ -112,6 +111,10 @@ class H5_DLLCPP DataSet : public H5Object, public AbstractDs { // defined in AbstractDs for generic datatype and specific // sub-types virtual hid_t p_get_type() const; + + protected: + // Sets the dataset id. + virtual void p_setId(const hid_t new_id); }; #ifndef H5_NO_NAMESPACE } diff --git a/c++/src/H5DataSpace.cpp b/c++/src/H5DataSpace.cpp index baad137..3d74b51 100644 --- a/c++/src/H5DataSpace.cpp +++ b/c++/src/H5DataSpace.cpp @@ -571,7 +571,7 @@ hid_t DataSpace::getId() const } //-------------------------------------------------------------------------- -// Function: DataSpace::setId +// Function: DataSpace::p_setId ///\brief Sets the identifier of this object to a new value. /// ///\exception H5::IdComponentException when the attempt to close the HDF5 @@ -582,14 +582,14 @@ hid_t DataSpace::getId() const // Then the object's id is reset to the new id. // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- -void DataSpace::setId(const hid_t new_id) +void DataSpace::p_setId(const hid_t new_id) { // handling references to this old id try { close(); } catch (Exception close_error) { - throw DataSpaceIException(inMemFunc("setId"), close_error.getDetailMsg()); + throw DataSpaceIException(inMemFunc("p_setId"), close_error.getDetailMsg()); } // reset object's id to the given id id = new_id; diff --git a/c++/src/H5DataSpace.h b/c++/src/H5DataSpace.h index 1173c26..80842f7 100644 --- a/c++/src/H5DataSpace.h +++ b/c++/src/H5DataSpace.h @@ -114,13 +114,16 @@ class H5_DLLCPP DataSpace : public IdComponent { // Gets the dataspace id. virtual hid_t getId() const; - virtual void setId(const hid_t new_id); // Destructor: properly terminates access to this dataspace. virtual ~DataSpace(); private: hid_t id; // HDF5 dataspace id + + protected: + // Sets the dataspace id. + virtual void p_setId(const hid_t new_id); }; #ifndef H5_NO_NAMESPACE } diff --git a/c++/src/H5DataType.cpp b/c++/src/H5DataType.cpp index 9575823..e023bda 100644 --- a/c++/src/H5DataType.cpp +++ b/c++/src/H5DataType.cpp @@ -695,7 +695,7 @@ hid_t DataType::getId() const } //-------------------------------------------------------------------------- -// Function: DataType::setId +// Function: DataType::p_setId ///\brief Sets the identifier of this object to a new value. /// ///\exception H5::IdComponentException when the attempt to close the HDF5 @@ -706,14 +706,14 @@ hid_t DataType::getId() const // Then the object's id is reset to the new id. // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- -void DataType::setId(const hid_t new_id) +void DataType::p_setId(const hid_t new_id) { // handling references to this old id try { close(); } catch (Exception close_error) { - throw DataTypeIException(inMemFunc("setId"), close_error.getDetailMsg()); + throw DataTypeIException(inMemFunc("p_setId"), close_error.getDetailMsg()); } // reset object's id to the given id id = new_id; diff --git a/c++/src/H5DataType.h b/c++/src/H5DataType.h index 509dd49..4e7ca03 100644 --- a/c++/src/H5DataType.h +++ b/c++/src/H5DataType.h @@ -119,13 +119,16 @@ class H5_DLLCPP DataType : public H5Object { // Gets the datatype id. virtual hid_t getId() const; - virtual void setId(const hid_t new_id); // Destructor: properly terminates access to this datatype. virtual ~DataType(); protected: hid_t id; // HDF5 datatype id + + // Sets the datatype id. + virtual void p_setId(const hid_t new_id); + private: void p_commit(hid_t loc_id, const char* name); }; diff --git a/c++/src/H5FaccProp.cpp b/c++/src/H5FaccProp.cpp index 6a70b3b..f2ab0f3 100644 --- a/c++/src/H5FaccProp.cpp +++ b/c++/src/H5FaccProp.cpp @@ -225,7 +225,7 @@ void FileAccPropList::getFamily(hsize_t& memb_size, FileAccPropList& memb_plist) { throw PropListIException("FileAccPropList::getFamily", "H5Pget_fapl_family failed"); } - memb_plist.setId(memb_plist_id); + memb_plist.p_setId(memb_plist_id); } //-------------------------------------------------------------------------- diff --git a/c++/src/H5File.cpp b/c++/src/H5File.cpp index 7cd1936..0e71543 100644 --- a/c++/src/H5File.cpp +++ b/c++/src/H5File.cpp @@ -732,7 +732,7 @@ hid_t H5File::getId() const } //-------------------------------------------------------------------------- -// Function: H5File::setId +// Function: H5File::p_setId ///\brief Sets the identifier of this object to a new value. /// ///\exception H5::IdComponentException when the attempt to close the HDF5 @@ -743,14 +743,14 @@ hid_t H5File::getId() const // Then the object's id is reset to the new id. // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- -void H5File::setId(const hid_t new_id) +void H5File::p_setId(const hid_t new_id) { // handling references to this old id try { close(); } catch (Exception E) { - throw FileIException("H5File::setId", E.getDetailMsg()); + throw FileIException("H5File::p_setId", E.getDetailMsg()); } // reset object's id to the given id id = new_id; diff --git a/c++/src/H5File.h b/c++/src/H5File.h index 92b1e20..b49118e 100644 --- a/c++/src/H5File.h +++ b/c++/src/H5File.h @@ -109,9 +109,8 @@ class H5_DLLCPP H5File : public IdComponent, public CommonFG { // Copy constructor: makes a copy of the original H5File object. H5File(const H5File& original); - // Gets/Sets the HDF5 file id. + // Gets the HDF5 file id. virtual hid_t getId() const; - virtual void setId(const hid_t new_id); // H5File destructor. virtual ~H5File(); @@ -136,6 +135,10 @@ class H5_DLLCPP H5File : public IdComponent, public CommonFG { // Retrieves a dataspace with the region pointed to selected. hid_t p_get_region(void *ref, H5R_type_t ref_type) const; + protected: + // Sets the HDF5 file id. + virtual void p_setId(const hid_t new_id); + #endif // DOXYGEN_SHOULD_SKIP_THIS }; diff --git a/c++/src/H5Group.cpp b/c++/src/H5Group.cpp index 6014466..f50691e 100644 --- a/c++/src/H5Group.cpp +++ b/c++/src/H5Group.cpp @@ -170,7 +170,7 @@ hid_t Group::getId() const } //-------------------------------------------------------------------------- -// Function: Group::setId +// Function: Group::p_setId ///\brief Sets the identifier of this object to a new value. /// ///\exception H5::IdComponentException when the attempt to close the HDF5 @@ -181,14 +181,14 @@ hid_t Group::getId() const // Then the object's id is reset to the new id. // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- -void Group::setId(const hid_t new_id) +void Group::p_setId(const hid_t new_id) { // handling references to this old id try { close(); } catch (Exception close_error) { - throw GroupIException("Group::setId", close_error.getDetailMsg()); + throw GroupIException("Group::p_setId", close_error.getDetailMsg()); } // reset object's id to the given id id = new_id; diff --git a/c++/src/H5Group.h b/c++/src/H5Group.h index 091ea72..d296b84 100644 --- a/c++/src/H5Group.h +++ b/c++/src/H5Group.h @@ -55,7 +55,6 @@ class H5_DLLCPP Group : public H5Object, public CommonFG { // Gets the group id. virtual hid_t getId() const; - virtual void setId(const hid_t new_id); // Destructor virtual ~Group(); @@ -65,6 +64,10 @@ class H5_DLLCPP Group : public H5Object, public CommonFG { private: hid_t id; // HDF5 group id + + protected: + // Sets the group id. + virtual void p_setId(const hid_t new_id); }; #ifndef H5_NO_NAMESPACE } diff --git a/c++/src/H5IdComponent.cpp b/c++/src/H5IdComponent.cpp index b22d869..a068b20 100644 --- a/c++/src/H5IdComponent.cpp +++ b/c++/src/H5IdComponent.cpp @@ -176,7 +176,7 @@ IdComponent& IdComponent::operator=( const IdComponent& rhs ) } // copy the data members from the rhs object - setId(rhs.getId()); + p_setId(rhs.getId()); incRefCount(getId()); // a = b, so there are two objects with the same // hdf5 id } @@ -184,6 +184,37 @@ IdComponent& IdComponent::operator=( const IdComponent& rhs ) } //-------------------------------------------------------------------------- +// Function: IdComponent::setId +///\brief Sets the identifier of this object to a new value. +/// +///\exception H5::IdComponentException when the attempt to close the HDF5 +/// object fails +// Description: +// The underlaying reference counting in the C library ensures +// that the current valid id of this object is properly closed. +// Then the object's id is reset to the new id. +// Programmer Binh-Minh Ribler - 2000 +// Modification +// 2008/7/23 - BMR +// Changed all subclasses' setId to p_setId and put back setId +// here. p_setId is used in the library where the id provided +// by a C API passed on to user's application in the form of a +// C++ API object, which will be destroyed properly, and so +// p_setId does not call incRefCount. On the other hand, the +// public version setId is used by other applications, in which +// the id passed to setId already has a reference count, so setId +// must call incRefCount. +//-------------------------------------------------------------------------- +void IdComponent::setId(const hid_t new_id) +{ + // set to new_id + p_setId(new_id); + + // increment the reference counter of the new id + incRefCount(); +} + +//-------------------------------------------------------------------------- // Function: IdComponent destructor ///\brief Noop destructor. // Programmer Binh-Minh Ribler - 2000 diff --git a/c++/src/H5IdComponent.h b/c++/src/H5IdComponent.h index c34b2da..7f573a1 100644 --- a/c++/src/H5IdComponent.h +++ b/c++/src/H5IdComponent.h @@ -51,7 +51,7 @@ class H5_DLLCPP IdComponent { virtual hid_t getId () const = 0; // Sets the identifier of this object to a new value. - virtual void setId(const hid_t new_id) = 0; + void setId(const hid_t new_id); // Creates an object to hold an HDF5 identifier. IdComponent( const hid_t h5_id ); @@ -88,6 +88,10 @@ class H5_DLLCPP IdComponent { // Verifies that the given id is valid. static bool p_valid_id(const hid_t obj_id); + // Sets the identifier of this object to a new value. - this one + // doesn't increment reference count + virtual void p_setId(const hid_t new_id) = 0; + #endif // DOXYGEN_SHOULD_SKIP_THIS }; // end class IdComponent diff --git a/c++/src/H5Object.cpp b/c++/src/H5Object.cpp index b2bdefb..9dafea8 100644 --- a/c++/src/H5Object.cpp +++ b/c++/src/H5Object.cpp @@ -441,7 +441,7 @@ void H5Object::dereference(H5File& h5file, void* ref) } // No failure, set id to the object - setId(temp_id); + p_setId(temp_id); } void H5Object::dereference(H5Object& obj, void* ref) @@ -455,7 +455,7 @@ void H5Object::dereference(H5Object& obj, void* ref) } // No failure, set id to the object - setId(temp_id); + p_setId(temp_id); } #ifndef H5_NO_DEPRECATED_SYMBOLS diff --git a/c++/src/H5PropList.cpp b/c++/src/H5PropList.cpp index 085dfd1..020bf18 100644 --- a/c++/src/H5PropList.cpp +++ b/c++/src/H5PropList.cpp @@ -223,7 +223,7 @@ hid_t PropList::getId() const } //-------------------------------------------------------------------------- -// Function: PropList::setId +// Function: PropList::p_setId ///\brief Sets the identifier of this object to a new value. /// ///\exception H5::IdComponentException when the attempt to close the HDF5 @@ -234,14 +234,14 @@ hid_t PropList::getId() const // Then the object's id is reset to the new id. // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- -void PropList::setId(const hid_t new_id) +void PropList::p_setId(const hid_t new_id) { // handling references to this old id try { close(); } catch (Exception close_error) { - throw PropListIException(inMemFunc("setId"), close_error.getDetailMsg()); + throw PropListIException(inMemFunc("p_setId"), close_error.getDetailMsg()); } // reset object's id to the given id id = new_id; diff --git a/c++/src/H5PropList.h b/c++/src/H5PropList.h index 75a3d21..5dfa538 100644 --- a/c++/src/H5PropList.h +++ b/c++/src/H5PropList.h @@ -105,13 +105,15 @@ class H5_DLLCPP PropList : public IdComponent { // Gets the property list id. virtual hid_t getId() const; - virtual void setId(const hid_t new_id); // Destructor: properly terminates access to this property list. virtual ~PropList(); protected: hid_t id; // HDF5 property list id + + // Sets the property list id. + virtual void p_setId(const hid_t new_id); }; #ifndef H5_NO_NAMESPACE -- cgit v0.12