From 94db436b376240951beead5f333e624b2117e524 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franz=20P=C3=B6schel?= Date: Fri, 8 Aug 2025 11:33:28 +0200 Subject: [PATCH 1/2] Fixes for deferred initialization --- include/openPMD/snapshots/ContainerImpls.hpp | 9 ++-- src/Series.cpp | 12 +++-- src/snapshots/ContainerImpls.cpp | 47 +++++++++++++++++--- 3 files changed, 54 insertions(+), 14 deletions(-) diff --git a/include/openPMD/snapshots/ContainerImpls.hpp b/include/openPMD/snapshots/ContainerImpls.hpp index 50ad2f8490..67ed31445c 100644 --- a/include/openPMD/snapshots/ContainerImpls.hpp +++ b/include/openPMD/snapshots/ContainerImpls.hpp @@ -34,12 +34,14 @@ class StatefulSnapshotsContainer : public AbstractSnapshotsContainer * make_reading_stateful_iterator. * The iterator is resolved upon calling get() below. */ - std::function m_begin; - std::optional m_bufferedIterator = std::nullopt; + std::variant, StatefulIterator *> + m_bufferedIterator; }; Members members; - StatefulSnapshotsContainer(std::function begin); + StatefulSnapshotsContainer( + std::variant, StatefulIterator *> + begin); auto get() -> StatefulIterator *; auto get() const -> StatefulIterator const *; @@ -64,6 +66,7 @@ class StatefulSnapshotsContainer : public AbstractSnapshotsContainer using AbstractSnapshotsContainer::currentIteration; auto currentIteration() const -> std::optional override; + auto currentIteration() -> std::optional override; auto begin() -> iterator override; auto end() -> iterator override; diff --git a/src/Series.cpp b/src/Series.cpp index d6e12a9546..c690f1cfb0 100644 --- a/src/Series.cpp +++ b/src/Series.cpp @@ -3194,7 +3194,7 @@ namespace { auto make_writing_stateful_iterator( Series const &copied_series, internal::SeriesData &series) - -> std::function + -> StatefulIterator * { if (!series.m_sharedStatefulIterator) { @@ -3202,12 +3202,16 @@ namespace std::make_unique( StatefulIterator::tag_write, copied_series); } - return [ptr = series.m_sharedStatefulIterator.get()]() { return ptr; }; + return series.m_sharedStatefulIterator.get(); } auto make_reading_stateful_iterator( Series copied_series, internal::SeriesData &series) - -> std::function + -> std::variant, StatefulIterator *> { + if (series.m_sharedStatefulIterator) + { + return series.m_sharedStatefulIterator.get(); + } return [s = std::move(copied_series), &series]() mutable { if (!series.m_sharedStatefulIterator) { @@ -3317,7 +3321,7 @@ Snapshots Series::makeSynchronousSnapshots() internal::default_or_explicit::default_); } - std::function begin; + std::variant, StatefulIterator *> begin; if (access::write(IOHandler()->m_frontendAccess)) { diff --git a/src/snapshots/ContainerImpls.cpp b/src/snapshots/ContainerImpls.cpp index 8c2acd134d..9804274ec7 100644 --- a/src/snapshots/ContainerImpls.cpp +++ b/src/snapshots/ContainerImpls.cpp @@ -1,6 +1,7 @@ #include "openPMD/snapshots/ContainerImpls.hpp" #include "openPMD/Error.hpp" #include "openPMD/IO/Access.hpp" +#include "openPMD/auxiliary/Variant.hpp" #include "openPMD/snapshots/ContainerTraits.hpp" #include "openPMD/snapshots/IteratorHelpers.hpp" #include "openPMD/snapshots/RandomAccessIterator.hpp" @@ -12,7 +13,7 @@ namespace openPMD { StatefulSnapshotsContainer::StatefulSnapshotsContainer( - std::function begin) + std::variant, StatefulIterator *> begin) : members{std::move(begin)} {} @@ -30,15 +31,34 @@ operator=(StatefulSnapshotsContainer &&other) noexcept(noexcept( auto StatefulSnapshotsContainer::get() -> StatefulIterator * { - if (!members.m_bufferedIterator.has_value()) - { - members.m_bufferedIterator = members.m_begin(); - } - return *members.m_bufferedIterator; + return std::visit( + auxiliary::overloaded{ + [this]( + std::function &deferred_initialization) { + auto it = deferred_initialization(); + this->members.m_bufferedIterator = it; + return it; + }, + [](StatefulIterator *it) { return it; }}, + members.m_bufferedIterator); } + +void breakpoint() +{} auto StatefulSnapshotsContainer::get() const -> StatefulIterator const * { - return members.m_bufferedIterator.value_or(nullptr); + return std::visit( + auxiliary::overloaded{ + [](std::function const &) + -> StatefulIterator const * { + breakpoint(); + throw std::runtime_error( + "[StatefulSnapshotscontainer] Initialization has been " + "deferred, but container is accessed as const, so cannot " + "initialize."); + }, + [](StatefulIterator const *it) { return it; }}, + members.m_bufferedIterator); } auto StatefulSnapshotsContainer::stateful_to_opaque(StatefulIterator const &it) @@ -60,6 +80,19 @@ auto StatefulSnapshotsContainer::currentIteration() const } } +auto StatefulSnapshotsContainer::currentIteration() + -> std::optional +{ + if (auto it = get(); it) + { + return it->peekCurrentlyOpenIteration(); + } + else + { + return std::nullopt; + } +} + StatefulSnapshotsContainer::~StatefulSnapshotsContainer() = default; auto StatefulSnapshotsContainer::begin() -> iterator From e82be0dba4c0b81b508cbe6581c6d69b7583d0b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franz=20P=C3=B6schel?= Date: Fri, 8 Aug 2025 11:55:41 +0200 Subject: [PATCH 2/2] Turn gcc9 run into a Debug build --- .github/workflows/linux.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml index 376db31b71..37b5331ddf 100644 --- a/.github/workflows/linux.yml +++ b/.github/workflows/linux.yml @@ -266,12 +266,15 @@ jobs: env: {CXXFLAGS: -Werror, PKG_CONFIG_PATH: /usr/lib/x86_64-linux-gnu/pkgconfig} run: | share/openPMD/download_samples.sh build + # Run a debug build, + # Pybind has some builtin checks only activated in debug mode. cmake -S . -B build \ -DopenPMD_USE_PYTHON=ON \ -DopenPMD_USE_MPI=ON \ -DopenPMD_USE_HDF5=ON \ -DopenPMD_USE_FILESYSTEM_HEADER=ON \ - -DopenPMD_USE_INVASIVE_TESTS=ON + -DopenPMD_USE_INVASIVE_TESTS=ON \ + -DCMAKE_BUILD_TYPE=Debug cmake --build build --parallel 4 ctest --test-dir build --output-on-failure