HDF5: Add cleaner way of handling object destruction (explicit Close() for file and dataset, all destructors have HDF5 TRY blocks)
This commit is contained in:
+64
-7
@@ -90,7 +90,12 @@ void HDF5DataSpace::SelectHyperslabWithStride(const std::vector<hsize_t> &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<hsize_t> &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<uint8_t> &val, const std::vector<hsize_t> &offset) {
|
||||
|
||||
Reference in New Issue
Block a user