mirror of
https://github.com/latentPrion/libspinscale.git
synced 2026-06-23 19:48:32 +00:00
Group: Enable aggregate exception to be passed as ptr
This commit is contained in:
@@ -564,10 +564,10 @@ struct Group
|
|||||||
memberAdapterCoro(memberInvoker, settlementIndex);
|
memberAdapterCoro(memberInvoker, settlementIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
void checkForAndReThrowGroupExceptions() const
|
std::exception_ptr captureAggregatedGroupExceptions() const
|
||||||
{
|
{
|
||||||
std::ostringstream ostream;
|
std::ostringstream ostream;
|
||||||
bool doThrow = false;
|
bool hasFailures = false;
|
||||||
|
|
||||||
for (auto &item : s.rsrc.settlements)
|
for (auto &item : s.rsrc.settlements)
|
||||||
{
|
{
|
||||||
@@ -577,7 +577,7 @@ struct Group
|
|||||||
|
|
||||||
assert(item.calleeException);
|
assert(item.calleeException);
|
||||||
|
|
||||||
doThrow = true;
|
hasFailures = true;
|
||||||
ostream << "Exc thrown in Group Adapter: ";
|
ostream << "Exc thrown in Group Adapter: ";
|
||||||
try {
|
try {
|
||||||
std::rethrow_exception(item.calleeException);
|
std::rethrow_exception(item.calleeException);
|
||||||
@@ -589,8 +589,19 @@ struct Group
|
|||||||
ostream << "\n";
|
ostream << "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (doThrow) {
|
if (!hasFailures) {
|
||||||
throw std::runtime_error(ostream.str());
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
return std::make_exception_ptr(std::runtime_error(ostream.str()));
|
||||||
|
}
|
||||||
|
|
||||||
|
void checkForAndReThrowGroupExceptions() const
|
||||||
|
{
|
||||||
|
std::exception_ptr aggregatedException =
|
||||||
|
captureAggregatedGroupExceptions();
|
||||||
|
if (aggregatedException) {
|
||||||
|
std::rethrow_exception(aggregatedException);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
#ifndef MULTI_OPERATION_RESULT_SET_H
|
#ifndef MULTI_OPERATION_RESULT_SET_H
|
||||||
#define MULTI_OPERATION_RESULT_SET_H
|
#define MULTI_OPERATION_RESULT_SET_H
|
||||||
|
|
||||||
|
#include <exception>
|
||||||
|
|
||||||
namespace sscl {
|
namespace sscl {
|
||||||
|
|
||||||
/** Plain aggregate for fan-out / fan-in results returned from coroutines. */
|
/** Plain aggregate for fan-out / fan-in results returned from coroutines. */
|
||||||
@@ -24,6 +26,25 @@ struct MultiOperationResultSet
|
|||||||
unsigned int nFailed;
|
unsigned int nFailed;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/** Fan-out / fan-in counts plus optional aggregated member failure. */
|
||||||
|
struct MultiOperationResultSetWithException
|
||||||
|
{
|
||||||
|
MultiOperationResultSetWithException() = default;
|
||||||
|
|
||||||
|
MultiOperationResultSetWithException(
|
||||||
|
MultiOperationResultSet resultsIn,
|
||||||
|
std::exception_ptr memberFailureExceptionIn = nullptr)
|
||||||
|
: results(resultsIn),
|
||||||
|
memberFailureException(memberFailureExceptionIn)
|
||||||
|
{}
|
||||||
|
|
||||||
|
bool hasMemberFailure() const
|
||||||
|
{ return memberFailureException != nullptr; }
|
||||||
|
|
||||||
|
MultiOperationResultSet results;
|
||||||
|
std::exception_ptr memberFailureException = nullptr;
|
||||||
|
};
|
||||||
|
|
||||||
} // namespace sscl
|
} // namespace sscl
|
||||||
|
|
||||||
#endif // MULTI_OPERATION_RESULT_SET_H
|
#endif // MULTI_OPERATION_RESULT_SET_H
|
||||||
|
|||||||
Reference in New Issue
Block a user