71 if (cancel && cancel->is_cancelled()) {
76 std::optional<T> result;
77 std::exception_ptr err;
79 auto body = [&]() -> asio::awaitable<void> {
81 result.emplace(
co_await std::move(aw));
83 err = std::current_exception();
116 auto child = cancel->fork();
117 child->bind_executor(io.get_executor());
118 asio::co_spawn(io, body(),
119 asio::bind_cancellation_slot(child->slot(),
130 if (err && cancel->is_cancelled()) {
134 asio::co_spawn(io, body(), asio::detached);
138 if (err) std::rethrow_exception(err);
139 return std::move(*result);
147 if (cancel && cancel->is_cancelled()) {
152 std::exception_ptr err;
154 auto body = [&]() -> asio::awaitable<void> {
156 co_await std::move(aw);
158 err = std::current_exception();
166 auto child = cancel->fork();
167 child->bind_executor(io.get_executor());
168 asio::co_spawn(io, body(),
169 asio::bind_cancellation_slot(child->slot(),
172 if (err && cancel->is_cancelled()) {
175 if (err) std::rethrow_exception(err);
178 asio::co_spawn(io, body(), asio::detached);
183 if (err) std::rethrow_exception(err);
195 asio::thread_pool pool(n_threads > 0 ? n_threads : 1);
196 std::optional<T> result;
197 std::exception_ptr err;
201 [&]() -> asio::awaitable<void> {
203 result.emplace(co_await std::move(aw));
205 err = std::current_exception();
213 if (err) std::rethrow_exception(err);
214 return std::move(*result);
219 asio::thread_pool pool(n_threads > 0 ? n_threads : 1);
220 std::exception_ptr err;
224 [&]() -> asio::awaitable<void> {
226 co_await std::move(aw);
228 err = std::current_exception();
235 if (err) std::rethrow_exception(err);