diff --git a/writer/HDF5Objects.cpp b/writer/HDF5Objects.cpp index b0c540e5..7164e760 100644 --- a/writer/HDF5Objects.cpp +++ b/writer/HDF5Objects.cpp @@ -90,7 +90,12 @@ void HDF5DataSpace::SelectHyperslabWithStride(const std::vector &start, } HDF5DataSpace::~HDF5DataSpace() { - if (id >= 0) H5Sclose(id); + if (id >= 0) { + H5E_BEGIN_TRY { + H5Sclose(id); + } H5E_END_TRY; + id = -1; + } } uint8_t HDF5DataSpace::GetNumOfDimensions() const { @@ -204,7 +209,12 @@ HDF5DataType::HDF5DataType(const HDF5DataSet &data_set) :HDF5Id() { } HDF5DataType::~HDF5DataType() { - if (id >= 0) H5Tclose(id); + if (id >= 0) { + H5E_BEGIN_TRY { + H5Tclose(id); + } H5E_END_TRY; + id = -1; + } } size_t HDF5DataType::GetElemSize() const { @@ -251,7 +261,12 @@ HDF5Dcpl::HDF5Dcpl(const HDF5DataSet &data_set) : HDF5Id() { } HDF5Dcpl::~HDF5Dcpl() { - if (id >= 0) H5Pclose(id); + if (id >= 0) { + H5E_BEGIN_TRY { + H5Pclose(id); + } H5E_END_TRY; + id = -1; + } } void HDF5Dcpl::SetChunking(const std::vector &dims) { @@ -308,7 +323,11 @@ HDF5Fapl::HDF5Fapl() : HDF5Id() { } HDF5Fapl::~HDF5Fapl() { - H5Pclose(id); + if (id >= 0) { + H5E_BEGIN_TRY { + H5Pclose(id); + } H5E_END_TRY; + } } void HDF5Fapl::SetVersionTo1p10orNewer() { @@ -685,7 +704,12 @@ HDF5Group::HDF5Group(const HDF5Object& parent, const char *name) : HDF5Object() } HDF5Group::~HDF5Group() { - H5Gclose(id); + if (id >= 0) { + H5E_BEGIN_TRY { + H5Gclose(id); + } H5E_END_TRY; + id = -1; + } } HDF5File::HDF5File(const std::string& filename, bool v1_10) : HDF5Object() { @@ -698,8 +722,27 @@ HDF5File::HDF5File(const std::string& filename, bool v1_10) : HDF5Object() { throw JFJochException(JFJochExceptionCategory::HDF5, "Cannot open/create data HDF5 file " + filename); } +void HDF5File::Close() { + if (id < 0) + return; + + if (H5Fflush(id, H5F_SCOPE_GLOBAL) < 0) + throw JFJochException(JFJochExceptionCategory::HDF5, "Failed to flush HDF5 file"); + + hid_t tmp = id; + id = -1; + + if (H5Fclose(tmp) < 0) + throw JFJochException(JFJochExceptionCategory::HDF5, "Failed to close HDF5 file"); +} + HDF5File::~HDF5File() { - if (id >= 0) H5Fclose(id); + if (id >= 0) { + H5E_BEGIN_TRY { + H5Fclose(id); + } H5E_END_TRY; + id = -1; + } } void HDF5File::Delete(const std::string& path) { @@ -799,8 +842,22 @@ std::string HDF5DataSet::ReadString() const { return buffer; } +void HDF5DataSet::Close() { + if (id < 0) + return; + hid_t tmp = id; + id = -1; + if (H5Dclose(tmp) < 0) + throw JFJochException(JFJochExceptionCategory::HDF5, "Cannot close HDF5 dataset"); +} + HDF5DataSet::~HDF5DataSet() { - if (id >= 0) H5Dclose(id); + if (id >= 0) { + H5E_BEGIN_TRY { + H5Dclose(id); + } H5E_END_TRY; + id = -1; + } } void HDF5DataSet::ReadDirectChunk(std::vector &val, const std::vector &offset) { diff --git a/writer/HDF5Objects.h b/writer/HDF5Objects.h index 09a0c48e..e822f83f 100644 --- a/writer/HDF5Objects.h +++ b/writer/HDF5Objects.h @@ -169,6 +169,7 @@ public: explicit HDF5File(const std::string& filename, bool v1_10 = false); ~HDF5File(); void Delete(const std::string& path); + void Close(); }; class HDF5ReadOnlyFile : public HDF5Object { @@ -321,6 +322,7 @@ public: } std::string ReadString() const; + void Close(); }; inline std::unique_ptr SaveScalar(const HDF5Object& parent, const std::string &name, const char* val) {