31 Operation&& operation,
32 boost::asio::yield_context yield,
33 std::chrono::steady_clock::duration timeout
36 boost::system::error_code error;
37 auto operationCompleted = std::make_shared<bool>(
false);
38 boost::asio::cancellation_signal cancellationSignal;
39 auto cyield = boost::asio::bind_cancellation_slot(cancellationSignal.slot(), yield[error]);
41 boost::asio::steady_timer timer{boost::asio::get_associated_executor(cyield), timeout};
42 timer.async_wait([&cancellationSignal,
43 operationCompleted](boost::system::error_code errorCode) {
44 if (!errorCode and !*operationCompleted)
45 cancellationSignal.emit(boost::asio::cancellation_type::terminal);
48 *operationCompleted =
true;
51 if (error == boost::system::errc::operation_canceled) {
52 return boost::system::errc::make_error_code(boost::system::errc::timed_out);
boost::system::error_code withTimeout(Operation &&operation, boost::asio::yield_context yield, std::chrono::steady_clock::duration timeout)
Perform a coroutine operation with a timeout.
Definition WithTimeout.hpp:30