@@ -1898,18 +1898,38 @@ void HDF5IOHandlerImpl::writeDataset(
18981898
18991899 File file = requireFile (" writeDataset" , writable, /* checkParent = */ true );
19001900
1901- hid_t dataset_id, filespace, memspace;
19021901 herr_t status;
1902+ hid_t dataset_id, filespace, memspace;
19031903 dataset_id = H5Dopen (
19041904 file.id , concrete_h5_file_position (writable).c_str (), H5P_DEFAULT);
19051905 VERIFY (
19061906 dataset_id >= 0 ,
19071907 " [HDF5] Internal error: Failed to open HDF5 dataset during dataset "
19081908 " write" );
1909+ auto defer_close_dataset = auxiliary::defer ([&]() {
1910+ status = H5Dclose (dataset_id);
1911+ if (status != 0 )
1912+ {
1913+ std::cerr << " [HDF5] Internal error: Failed to close dataset " +
1914+ concrete_h5_file_position (writable) +
1915+ " during dataset write"
1916+ << std::endl;
1917+ }
1918+ });
19091919
19101920 filespace = H5Dget_space (dataset_id);
1921+ auto defer_close_filespace = auxiliary::defer ([&]() {
1922+ status = H5Sclose (filespace);
1923+ if (status != 0 )
1924+ {
1925+ std::cerr << " [HDF5] Internal error: Failed to close dataset file "
1926+ " space during dataset write"
1927+ << std::endl;
1928+ }
1929+ });
19111930 int ndims = H5Sget_simple_extent_ndims (filespace);
19121931
1932+ auxiliary::opaque_defer_type defer_close_memspace;
19131933 if (ndims == 0 )
19141934 {
19151935 if (parameters.offset != Offset{0 } || parameters.extent != Extent{1 })
@@ -1930,6 +1950,16 @@ void HDF5IOHandlerImpl::writeDataset(
19301950 memspace > 0 ,
19311951 " [HDF5] Internal error: Failed to create memspace during dataset "
19321952 " write" );
1953+ defer_close_memspace =
1954+ auxiliary::defer ([&]() {
1955+ status = H5Sclose (memspace); //
1956+ if (status != 0 )
1957+ {
1958+ std::cerr << " [HDF5] Internal error: Failed to close "
1959+ " dataset memory space during dataset write"
1960+ << std::endl;
1961+ }
1962+ }).to_opaque ();
19331963 }
19341964 else
19351965 {
@@ -1943,6 +1973,16 @@ void HDF5IOHandlerImpl::writeDataset(
19431973 block.push_back (static_cast <hsize_t >(val));
19441974 memspace = H5Screate_simple (
19451975 static_cast <int >(block.size ()), block.data (), nullptr );
1976+ defer_close_memspace =
1977+ auxiliary::defer ([&]() {
1978+ status = H5Sclose (memspace); //
1979+ if (status != 0 )
1980+ {
1981+ std::cerr << " [HDF5] Internal error: Failed to close "
1982+ " dataset memory space during dataset write"
1983+ << std::endl;
1984+ }
1985+ }).to_opaque ();
19461986 status = H5Sselect_hyperslab (
19471987 filespace,
19481988 H5S_SELECT_SET,
@@ -1973,6 +2013,15 @@ void HDF5IOHandlerImpl::writeDataset(
19732013 dataType >= 0 ,
19742014 " [HDF5] Internal error: Failed to get HDF5 datatype during dataset "
19752015 " write" );
2016+ auto defer_close_dataType = auxiliary::defer ([&]() {
2017+ status = H5Tclose (dataType);
2018+ if (status == 0 )
2019+ {
2020+ std::cerr << " [HDF5] Internal error: Failed to close dataset "
2021+ " datatype during dataset write."
2022+ << std::endl;
2023+ }
2024+ });
19762025 switch (a.dtype )
19772026 {
19782027 using DT = Datatype;
@@ -2011,26 +2060,6 @@ void HDF5IOHandlerImpl::writeDataset(
20112060 default :
20122061 throw std::runtime_error (" [HDF5] Datatype not implemented in HDF5 IO" );
20132062 }
2014- status = H5Tclose (dataType); //
2015- VERIFY (
2016- status == 0 ,
2017- " [HDF5] Internal error: Failed to close dataset datatype during "
2018- " dataset write" );
2019- status = H5Sclose (filespace); //
2020- VERIFY (
2021- status == 0 ,
2022- " [HDF5] Internal error: Failed to close dataset file space during "
2023- " dataset write" );
2024- status = H5Sclose (memspace); //
2025- VERIFY (
2026- status == 0 ,
2027- " [HDF5] Internal error: Failed to close dataset memory space during "
2028- " dataset write" );
2029- status = H5Dclose (dataset_id); //
2030- VERIFY (
2031- status == 0 ,
2032- " [HDF5] Internal error: Failed to close dataset " +
2033- concrete_h5_file_position (writable) + " during dataset write" );
20342063
20352064 m_fileNames[writable] = file.name ;
20362065}
0 commit comments