From 21fa125d52338d386619e84727e7cfdd5da7a3bf Mon Sep 17 00:00:00 2001 From: Latent Prion Date: Tue, 14 Jul 2026 05:06:18 -0400 Subject: [PATCH] Summarize and merge MultiOperationResultSetWithException from settled Groups. Co-authored-by: Cursor --- CMakeLists.txt | 1 + include/spinscale/multiOperationResultSet.h | 23 ++++++++++++++ src/multiOperationResultSet.cpp | 35 +++++++++++++++++++++ 3 files changed, 59 insertions(+) create mode 100644 src/multiOperationResultSet.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index c5686d3..506a601 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -87,6 +87,7 @@ add_library(spinscale SHARED src/puppetApplication.cpp src/runtime.cpp src/callableTracer.cpp + src/multiOperationResultSet.cpp ) set_target_properties(spinscale PROPERTIES diff --git a/include/spinscale/multiOperationResultSet.h b/include/spinscale/multiOperationResultSet.h index 1d415c4..e930c46 100644 --- a/include/spinscale/multiOperationResultSet.h +++ b/include/spinscale/multiOperationResultSet.h @@ -4,6 +4,9 @@ #include namespace sscl { +namespace co { +struct Group; +} // namespace co /** Plain aggregate for fan-out / fan-in results returned from coroutines. */ struct MultiOperationResultSet @@ -38,9 +41,29 @@ struct MultiOperationResultSetWithException memberFailureException(memberFailureExceptionIn) {} + /** Summarize a settled Group into counts + aggregated member failure. */ + explicit MultiOperationResultSetWithException(const co::Group &group); + bool hasMemberFailure() const { return memberFailureException != nullptr; } + /** Combine this result set with another phase's counts and exception. */ + MultiOperationResultSetWithException mergeWith( + const MultiOperationResultSetWithException &other) const + { + std::exception_ptr memberFailure = memberFailureException; + if (!memberFailure && other.hasMemberFailure()) { + memberFailure = other.memberFailureException; + } + + return MultiOperationResultSetWithException( + MultiOperationResultSet( + results.nTotal + other.results.nTotal, + results.nSucceeded + other.results.nSucceeded, + results.nFailed + other.results.nFailed), + memberFailure); + } + MultiOperationResultSet results; std::exception_ptr memberFailureException = nullptr; }; diff --git a/src/multiOperationResultSet.cpp b/src/multiOperationResultSet.cpp new file mode 100644 index 0000000..1058622 --- /dev/null +++ b/src/multiOperationResultSet.cpp @@ -0,0 +1,35 @@ +#include + +#include +#include + +namespace sscl { + +MultiOperationResultSetWithException::MultiOperationResultSetWithException( + const co::Group &group) +{ + unsigned int nSucceeded = 0; + unsigned int nFailed = 0; + using SettlementType = co::Group::SettlementDescriptor::TypeE; + + for (const auto &desc : group.s.rsrc.settlements) + { + if (desc.type == SettlementType::EXCEPTION_THROWN) { + nFailed++; + } + else { + nSucceeded++; + } + } + + results = MultiOperationResultSet( + static_cast(group.s.rsrc.settlements.size()), + nSucceeded, + nFailed); + + if (nFailed > 0) { + memberFailureException = group.captureAggregatedGroupExceptions(); + } +} + +} // namespace sscl