Add sscl::co::syncAwaitNonViralCoro for blocking non-viral coroutine launch.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-29 00:21:45 -04:00
co-authored by Cursor
parent 3d81ee92aa
commit 01efbd8c94
@@ -0,0 +1,43 @@
#ifndef SYNC_AWAIT_NON_VIRAL_CORO_H
#define SYNC_AWAIT_NON_VIRAL_CORO_H
#include <boostAsioLinkageFix.h>
#include <spinscale/componentThread.h>
#include <spinscale/co/nonViralTaskNursery.h>
#include <exception>
#include <functional>
namespace sscl::co {
/** Launch a non-viral coroutine on the current ComponentThread io_context and
* block until it settles, rethrowing any stored exception.
*/
template<typename InvokerFactory>
void syncAwaitNonViralCoro(InvokerFactory&& _invokerFactory)
{
std::exception_ptr slotException;
NonViralTaskNursery nursery;
nursery.openAdmission();
nursery.launch(
[&_invokerFactory](NonViralTaskNursery::Slot::Lease& lease)
{
return _invokerFactory(lease);
},
[&slotException](std::exception_ptr& exceptionPtr)
{
slotException = exceptionPtr;
});
nursery.closeAdmission();
nursery.syncAwaitAllSettlements(
sscl::ComponentThread::getSelf()->getIoContext());
if (slotException) {
std::rethrow_exception(slotException);
}
}
} // namespace sscl::co
#endif // SYNC_AWAIT_NON_VIRAL_CORO_H