Skip to content

Commit bac28cf

Browse files
committed
Add remaining fixes
1 parent fabc0d8 commit bac28cf

File tree

2 files changed

+73
-21
lines changed

2 files changed

+73
-21
lines changed

include/openPMD/auxiliary/Defer.hpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#pragma once
22

3+
#include <functional>
34
#include <type_traits>
45
#include <utility>
56

@@ -9,12 +10,34 @@ template <typename F>
910
struct defer_type
1011
{
1112
F functor;
13+
bool do_run_this = true;
1214
~defer_type()
1315
{
16+
if (!do_run_this)
17+
{
18+
return;
19+
}
20+
do_run_this = false;
1421
std::move(functor)();
1522
}
23+
24+
auto to_opaque() && -> defer_type<std::function<void()>>
25+
{
26+
do_run_this = false;
27+
if (!do_run_this)
28+
{
29+
return defer_type<std::function<void()>>{{}, false};
30+
}
31+
else
32+
{
33+
return defer_type<std::function<void()>>{
34+
std::function<void()>{std::move(functor)}};
35+
}
36+
}
1637
};
1738

39+
using opaque_defer_type = defer_type<std::function<void()>>;
40+
1841
template <typename F>
1942
auto defer(F &&functor) -> defer_type<std::remove_reference_t<F>>
2043
{

src/IO/HDF5/HDF5IOHandler.cpp

Lines changed: 50 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)