diff options
author | Binh-Minh Ribler <bmribler@hdfgroup.org> | 2005-07-10 11:26:56 (GMT) |
---|---|---|
committer | Binh-Minh Ribler <bmribler@hdfgroup.org> | 2005-07-10 11:26:56 (GMT) |
commit | b14a4fd95f5c71f31ec344e13a7c398015da41e6 (patch) | |
tree | d51925c61682fdf2e3e9422abb08ca753749ab9b /c++/src/H5File.cpp | |
parent | 6aa7ea9331f4181f29d6a19bf9d53fc330c3ff88 (diff) | |
download | hdf5-b14a4fd95f5c71f31ec344e13a7c398015da41e6.zip hdf5-b14a4fd95f5c71f31ec344e13a7c398015da41e6.tar.gz hdf5-b14a4fd95f5c71f31ec344e13a7c398015da41e6.tar.bz2 |
[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)
Diffstat (limited to 'c++/src/H5File.cpp')
-rw-r--r-- | c++/src/H5File.cpp | 59 |
1 files changed, 29 insertions, 30 deletions
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() { |