include/boost/corosio/detail/timeout_awaitable.hpp

100.0% Lines (72/72) 85.1% List of functions (126/148) 44.2% Branches (160/362)
timeout_awaitable.hpp
f(x) Functions (148)
Function Calls Lines Branches Blocks
boost::corosio::detail::timeout_awaitable<auto boost::capy::any_read_stream::read_some<boost::capy::mutable_buffer>(boost::capy::mutable_buffer)::awaitable>::stop_forwarder::operator()() const :84 0 100.0% 0.0% boost::corosio::detail::timeout_awaitable<auto boost::capy::any_write_stream::write_some<boost::capy::const_buffer>(boost::capy::const_buffer)::awaitable>::stop_forwarder::operator()() const :84 0 100.0% 0.0% boost::corosio::detail::timeout_awaitable<boost::capy::task<std::__1::tuple<std::__1::error_code, int>>>::stop_forwarder::operator()() const :84 0 100.0% 0.0% boost::corosio::detail::timeout_awaitable<boost::corosio::delay_awaitable>::stop_forwarder::operator()() const :84 2003x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::detail::timeout_awaitable<auto boost::capy::any_read_stream::read_some<boost::capy::mutable_buffer>(boost::capy::mutable_buffer)::awaitable>>::stop_forwarder::operator()() const :84 0 100.0% 0.0% boost::corosio::detail::timeout_awaitable<boost::corosio::detail::timeout_awaitable<boost::corosio::delay_awaitable>>::stop_forwarder::operator()() const :84 0 100.0% 0.0% boost::corosio::detail::timeout_awaitable<boost::corosio::io_read_stream::read_some_awaitable<boost::capy::mutable_buffer>>::stop_forwarder::operator()() const :84 0 25.0% 0.0% boost::corosio::detail::timeout_awaitable<boost::corosio::payload_awaitable>::stop_forwarder::operator()() const :84 0 100.0% 0.0% boost::corosio::detail::timeout_awaitable<boost::corosio::tcp_socket::connect_awaitable>::stop_forwarder::operator()() const :84 1x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::tcp_socket::wait_awaitable>::stop_forwarder::operator()() const :84 0 25.0% 0.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::kqueue_t{}>::testInnerErrorPassesThrough()::erroring_awaitable>::stop_forwarder::operator()() const :84 0 100.0% 0.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::kqueue_t{}>::testInnerExceptionPropagates()::throwing_awaitable>::stop_forwarder::operator()() const :84 0 100.0% 0.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::kqueue_t{}>::testReadyInnerCanceledNotRemapped()::ready_canceled_awaitable>::stop_forwarder::operator()() const :84 0 100.0% 0.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::kqueue_t{}>::testReadyInnerCompletesWithoutSuspend()::ready_awaitable>::stop_forwarder::operator()() const :84 0 100.0% 0.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::select_t{}>::testInnerErrorPassesThrough()::erroring_awaitable>::stop_forwarder::operator()() const :84 0 100.0% 0.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::select_t{}>::testInnerExceptionPropagates()::throwing_awaitable>::stop_forwarder::operator()() const :84 0 100.0% 0.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::select_t{}>::testReadyInnerCanceledNotRemapped()::ready_canceled_awaitable>::stop_forwarder::operator()() const :84 0 50.0% 0.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::select_t{}>::testReadyInnerCompletesWithoutSuspend()::ready_awaitable>::stop_forwarder::operator()() const :84 0 100.0% 0.0% boost::corosio::detail::timeout_awaitable<boost::corosio::delay_awaitable>::timeout_awaitable(boost::corosio::delay_awaitable&&, std::__1::chrono::time_point<std::__1::chrono::steady_clock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000000l>>>) :105 8x 100.0% 50.0% 100.0% boost::corosio::detail::timeout_awaitable<auto boost::capy::any_read_stream::read_some<boost::capy::mutable_buffer>(boost::capy::mutable_buffer)::awaitable>::timeout_awaitable(boost::corosio::detail::timeout_awaitable<auto boost::capy::any_read_stream::read_some<boost::capy::mutable_buffer>(boost::capy::mutable_buffer)::awaitable>&&, std::__1::chrono::duration<long long, std::__1::chrono::ratio<1l, 1000000000l>>) :112 12x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<auto boost::capy::any_write_stream::write_some<boost::capy::const_buffer>(boost::capy::const_buffer)::awaitable>::timeout_awaitable(boost::corosio::detail::timeout_awaitable<auto boost::capy::any_write_stream::write_some<boost::capy::const_buffer>(boost::capy::const_buffer)::awaitable>&&, std::__1::chrono::duration<long long, std::__1::chrono::ratio<1l, 1000000000l>>) :112 4x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::capy::task<std::__1::tuple<std::__1::error_code, int>>>::timeout_awaitable(boost::capy::task<std::__1::tuple<std::__1::error_code, int>>&&, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000000l>>) :112 4x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::delay_awaitable>::timeout_awaitable(boost::corosio::delay_awaitable&&, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000000l>>) :112 4048x 100.0% 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::detail::timeout_awaitable<auto boost::capy::any_read_stream::read_some<boost::capy::mutable_buffer>(boost::capy::mutable_buffer)::awaitable>>::timeout_awaitable(boost::corosio::detail::timeout_awaitable<boost::corosio::detail::timeout_awaitable<auto boost::capy::any_read_stream::read_some<boost::capy::mutable_buffer>(boost::capy::mutable_buffer)::awaitable>>&&, std::__1::chrono::duration<long long, std::__1::chrono::ratio<1l, 1000000000l>>) :112 4x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::detail::timeout_awaitable<boost::corosio::delay_awaitable>>::timeout_awaitable(boost::corosio::detail::timeout_awaitable<boost::corosio::delay_awaitable>&&, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000000l>>) :112 4x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::io_read_stream::read_some_awaitable<boost::capy::mutable_buffer>>::timeout_awaitable(boost::corosio::io_read_stream::read_some_awaitable<boost::capy::mutable_buffer>&&, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000000l>>) :112 6x 100.0% 50.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::payload_awaitable>::timeout_awaitable(boost::corosio::payload_awaitable&&, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000000l>>) :112 8x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::tcp_socket::connect_awaitable>::timeout_awaitable(boost::corosio::tcp_socket::connect_awaitable&&, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000000l>>) :112 2x 100.0% 50.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::tcp_socket::wait_awaitable>::timeout_awaitable(boost::corosio::tcp_socket::wait_awaitable&&, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000000l>>) :112 2x 100.0% 50.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::kqueue_t{}>::testInnerErrorPassesThrough()::erroring_awaitable>::timeout_awaitable(boost::corosio::timeout_test<boost::corosio::kqueue_t{}>::testInnerErrorPassesThrough()::erroring_awaitable&&, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000000l>>) :112 2x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::kqueue_t{}>::testInnerExceptionPropagates()::throwing_awaitable>::timeout_awaitable(boost::corosio::timeout_test<boost::corosio::kqueue_t{}>::testInnerExceptionPropagates()::throwing_awaitable&&, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000000l>>) :112 2x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::kqueue_t{}>::testReadyInnerCanceledNotRemapped()::ready_canceled_awaitable>::timeout_awaitable(boost::corosio::timeout_test<boost::corosio::kqueue_t{}>::testReadyInnerCanceledNotRemapped()::ready_canceled_awaitable&&, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000000l>>) :112 2x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::kqueue_t{}>::testReadyInnerCompletesWithoutSuspend()::ready_awaitable>::timeout_awaitable(boost::corosio::timeout_test<boost::corosio::kqueue_t{}>::testReadyInnerCompletesWithoutSuspend()::ready_awaitable&&, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000000l>>) :112 2x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::select_t{}>::testInnerErrorPassesThrough()::erroring_awaitable>::timeout_awaitable(boost::corosio::timeout_test<boost::corosio::select_t{}>::testInnerErrorPassesThrough()::erroring_awaitable&&, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000000l>>) :112 2x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::select_t{}>::testInnerExceptionPropagates()::throwing_awaitable>::timeout_awaitable(boost::corosio::timeout_test<boost::corosio::select_t{}>::testInnerExceptionPropagates()::throwing_awaitable&&, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000000l>>) :112 2x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::select_t{}>::testReadyInnerCanceledNotRemapped()::ready_canceled_awaitable>::timeout_awaitable(boost::corosio::timeout_test<boost::corosio::select_t{}>::testReadyInnerCanceledNotRemapped()::ready_canceled_awaitable&&, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000000l>>) :112 2x 100.0% 46.9% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::select_t{}>::testReadyInnerCompletesWithoutSuspend()::ready_awaitable>::timeout_awaitable(boost::corosio::timeout_test<boost::corosio::select_t{}>::testReadyInnerCompletesWithoutSuspend()::ready_awaitable&&, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000000l>>) :112 2x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<auto boost::capy::any_read_stream::read_some<boost::capy::mutable_buffer>(boost::capy::mutable_buffer)::awaitable>::~timeout_awaitable() :119 28x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<auto boost::capy::any_write_stream::write_some<boost::capy::const_buffer>(boost::capy::const_buffer)::awaitable>::~timeout_awaitable() :119 8x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::capy::task<std::__1::tuple<std::__1::error_code, int>>>::~timeout_awaitable() :119 8x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::delay_awaitable>::~timeout_awaitable() :119 8111x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::detail::timeout_awaitable<auto boost::capy::any_read_stream::read_some<boost::capy::mutable_buffer>(boost::capy::mutable_buffer)::awaitable>>::~timeout_awaitable() :119 8x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::detail::timeout_awaitable<boost::corosio::delay_awaitable>>::~timeout_awaitable() :119 8x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::io_read_stream::read_some_awaitable<boost::capy::mutable_buffer>>::~timeout_awaitable() :119 12x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::payload_awaitable>::~timeout_awaitable() :119 12x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::tcp_socket::connect_awaitable>::~timeout_awaitable() :119 4x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::tcp_socket::wait_awaitable>::~timeout_awaitable() :119 4x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::kqueue_t{}>::testInnerErrorPassesThrough()::erroring_awaitable>::~timeout_awaitable() :119 4x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::kqueue_t{}>::testInnerExceptionPropagates()::throwing_awaitable>::~timeout_awaitable() :119 4x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::kqueue_t{}>::testReadyInnerCanceledNotRemapped()::ready_canceled_awaitable>::~timeout_awaitable() :119 4x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::kqueue_t{}>::testReadyInnerCompletesWithoutSuspend()::ready_awaitable>::~timeout_awaitable() :119 4x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::select_t{}>::testInnerErrorPassesThrough()::erroring_awaitable>::~timeout_awaitable() :119 4x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::select_t{}>::testInnerExceptionPropagates()::throwing_awaitable>::~timeout_awaitable() :119 4x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::select_t{}>::testReadyInnerCanceledNotRemapped()::ready_canceled_awaitable>::~timeout_awaitable() :119 4x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::select_t{}>::testReadyInnerCompletesWithoutSuspend()::ready_awaitable>::~timeout_awaitable() :119 4x 100.0% 100.0% _ZN5boost7corosio6detail17timeout_awaitableINS2_IZNS_4capy15any_read_stream9read_someINS3_14mutable_bufferEEEDaT_E9awaitableEEEC1EOSB_ :125 2x 100.0% 100.0% _ZN5boost7corosio6detail17timeout_awaitableINS2_IZNS_4capy15any_read_stream9read_someINS3_14mutable_bufferEEEDaT_E9awaitableEEEC2EOSB_ :125 2x 100.0% 100.0% _ZN5boost7corosio6detail17timeout_awaitableIZNS_4capy15any_read_stream9read_someINS3_14mutable_bufferEEEDaT_E9awaitableEC1EOSA_ :125 8x 100.0% 100.0% _ZN5boost7corosio6detail17timeout_awaitableIZNS_4capy15any_read_stream9read_someINS3_14mutable_bufferEEEDaT_E9awaitableEC2EOSA_ :125 8x 100.0% 100.0% _ZN5boost7corosio6detail17timeout_awaitableIZNS_4capy16any_write_stream10write_someINS3_12const_bufferEEEDaT_E9awaitableEC1EOSA_ :125 2x 100.0% 100.0% _ZN5boost7corosio6detail17timeout_awaitableIZNS_4capy16any_write_stream10write_someINS3_12const_bufferEEEDaT_E9awaitableEC2EOSA_ :125 2x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::capy::task<std::__1::tuple<std::__1::error_code, int>>>::timeout_awaitable(boost::corosio::detail::timeout_awaitable<boost::capy::task<std::__1::tuple<std::__1::error_code, int>>>&&) :125 4x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::delay_awaitable>::timeout_awaitable(boost::corosio::detail::timeout_awaitable<boost::corosio::delay_awaitable>&&) :125 4058x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::detail::timeout_awaitable<boost::corosio::delay_awaitable>>::timeout_awaitable(boost::corosio::detail::timeout_awaitable<boost::corosio::detail::timeout_awaitable<boost::corosio::delay_awaitable>>&&) :125 4x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::io_read_stream::read_some_awaitable<boost::capy::mutable_buffer>>::timeout_awaitable(boost::corosio::detail::timeout_awaitable<boost::corosio::io_read_stream::read_some_awaitable<boost::capy::mutable_buffer>>&&) :125 6x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::payload_awaitable>::timeout_awaitable(boost::corosio::detail::timeout_awaitable<boost::corosio::payload_awaitable>&&) :125 4x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::tcp_socket::connect_awaitable>::timeout_awaitable(boost::corosio::detail::timeout_awaitable<boost::corosio::tcp_socket::connect_awaitable>&&) :125 2x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::tcp_socket::wait_awaitable>::timeout_awaitable(boost::corosio::detail::timeout_awaitable<boost::corosio::tcp_socket::wait_awaitable>&&) :125 2x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::kqueue_t{}>::testInnerErrorPassesThrough()::erroring_awaitable>::timeout_awaitable(boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::kqueue_t{}>::testInnerErrorPassesThrough()::erroring_awaitable>&&) :125 2x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::kqueue_t{}>::testInnerExceptionPropagates()::throwing_awaitable>::timeout_awaitable(boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::kqueue_t{}>::testInnerExceptionPropagates()::throwing_awaitable>&&) :125 2x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::kqueue_t{}>::testReadyInnerCanceledNotRemapped()::ready_canceled_awaitable>::timeout_awaitable(boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::kqueue_t{}>::testReadyInnerCanceledNotRemapped()::ready_canceled_awaitable>&&) :125 2x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::kqueue_t{}>::testReadyInnerCompletesWithoutSuspend()::ready_awaitable>::timeout_awaitable(boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::kqueue_t{}>::testReadyInnerCompletesWithoutSuspend()::ready_awaitable>&&) :125 2x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::select_t{}>::testInnerErrorPassesThrough()::erroring_awaitable>::timeout_awaitable(boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::select_t{}>::testInnerErrorPassesThrough()::erroring_awaitable>&&) :125 2x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::select_t{}>::testInnerExceptionPropagates()::throwing_awaitable>::timeout_awaitable(boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::select_t{}>::testInnerExceptionPropagates()::throwing_awaitable>&&) :125 2x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::select_t{}>::testReadyInnerCanceledNotRemapped()::ready_canceled_awaitable>::timeout_awaitable(boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::select_t{}>::testReadyInnerCanceledNotRemapped()::ready_canceled_awaitable>&&) :125 2x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::select_t{}>::testReadyInnerCompletesWithoutSuspend()::ready_awaitable>::timeout_awaitable(boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::select_t{}>::testReadyInnerCompletesWithoutSuspend()::ready_awaitable>&&) :125 2x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<auto boost::capy::any_read_stream::read_some<boost::capy::mutable_buffer>(boost::capy::mutable_buffer)::awaitable>::await_ready() :145 6x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<auto boost::capy::any_write_stream::write_some<boost::capy::const_buffer>(boost::capy::const_buffer)::awaitable>::await_ready() :145 2x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::capy::task<std::__1::tuple<std::__1::error_code, int>>>::await_ready() :145 2x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::delay_awaitable>::await_ready() :145 2026x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::detail::timeout_awaitable<auto boost::capy::any_read_stream::read_some<boost::capy::mutable_buffer>(boost::capy::mutable_buffer)::awaitable>>::await_ready() :145 2x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::detail::timeout_awaitable<boost::corosio::delay_awaitable>>::await_ready() :145 2x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::io_read_stream::read_some_awaitable<boost::capy::mutable_buffer>>::await_ready() :145 3x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::payload_awaitable>::await_ready() :145 2x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::tcp_socket::connect_awaitable>::await_ready() :145 1x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::tcp_socket::wait_awaitable>::await_ready() :145 1x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::kqueue_t{}>::testInnerErrorPassesThrough()::erroring_awaitable>::await_ready() :145 1x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::kqueue_t{}>::testInnerExceptionPropagates()::throwing_awaitable>::await_ready() :145 1x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::kqueue_t{}>::testReadyInnerCanceledNotRemapped()::ready_canceled_awaitable>::await_ready() :145 1x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::kqueue_t{}>::testReadyInnerCompletesWithoutSuspend()::ready_awaitable>::await_ready() :145 1x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::select_t{}>::testInnerErrorPassesThrough()::erroring_awaitable>::await_ready() :145 1x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::select_t{}>::testInnerExceptionPropagates()::throwing_awaitable>::await_ready() :145 1x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::select_t{}>::testReadyInnerCanceledNotRemapped()::ready_canceled_awaitable>::await_ready() :145 1x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::select_t{}>::testReadyInnerCompletesWithoutSuspend()::ready_awaitable>::await_ready() :145 1x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<auto boost::capy::any_read_stream::read_some<boost::capy::mutable_buffer>(boost::capy::mutable_buffer)::awaitable>::await_suspend(std::__1::coroutine_handle<void>, boost::capy::io_env const*) :150 6x 100.0% 37.0% boost::corosio::detail::timeout_awaitable<auto boost::capy::any_write_stream::write_some<boost::capy::const_buffer>(boost::capy::const_buffer)::awaitable>::await_suspend(std::__1::coroutine_handle<void>, boost::capy::io_env const*) :150 2x 100.0% 37.0% boost::corosio::detail::timeout_awaitable<boost::capy::task<std::__1::tuple<std::__1::error_code, int>>>::await_suspend(std::__1::coroutine_handle<void>, boost::capy::io_env const*) :150 2x 100.0% 37.0% boost::corosio::detail::timeout_awaitable<boost::corosio::delay_awaitable>::await_suspend(std::__1::coroutine_handle<void>, boost::capy::io_env const*) :150 2027x 85.0% 50.0% 44.0% boost::corosio::detail::timeout_awaitable<boost::corosio::detail::timeout_awaitable<auto boost::capy::any_read_stream::read_some<boost::capy::mutable_buffer>(boost::capy::mutable_buffer)::awaitable>>::await_suspend(std::__1::coroutine_handle<void>, boost::capy::io_env const*) :150 2x 100.0% 37.0% boost::corosio::detail::timeout_awaitable<boost::corosio::detail::timeout_awaitable<boost::corosio::delay_awaitable>>::await_suspend(std::__1::coroutine_handle<void>, boost::capy::io_env const*) :150 2x 100.0% 37.0% boost::corosio::detail::timeout_awaitable<boost::corosio::io_read_stream::read_some_awaitable<boost::capy::mutable_buffer>>::await_suspend(std::__1::coroutine_handle<void>, boost::capy::io_env const*) :150 3x 80.0% 41.7% 38.0% boost::corosio::detail::timeout_awaitable<boost::corosio::payload_awaitable>::await_suspend(std::__1::coroutine_handle<void>, boost::capy::io_env const*) :150 4x 100.0% 75.0% boost::corosio::detail::timeout_awaitable<boost::corosio::tcp_socket::connect_awaitable>::await_suspend(std::__1::coroutine_handle<void>, boost::capy::io_env const*) :150 1x 80.0% 41.7% 38.0% boost::corosio::detail::timeout_awaitable<boost::corosio::tcp_socket::wait_awaitable>::await_suspend(std::__1::coroutine_handle<void>, boost::capy::io_env const*) :150 1x 80.0% 41.7% 38.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::kqueue_t{}>::testInnerErrorPassesThrough()::erroring_awaitable>::await_suspend(std::__1::coroutine_handle<void>, boost::capy::io_env const*) :150 1x 100.0% 37.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::kqueue_t{}>::testInnerExceptionPropagates()::throwing_awaitable>::await_suspend(std::__1::coroutine_handle<void>, boost::capy::io_env const*) :150 1x 100.0% 37.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::kqueue_t{}>::testReadyInnerCanceledNotRemapped()::ready_canceled_awaitable>::await_suspend(std::__1::coroutine_handle<void>, boost::capy::io_env const*) :150 0 100.0% 0.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::kqueue_t{}>::testReadyInnerCompletesWithoutSuspend()::ready_awaitable>::await_suspend(std::__1::coroutine_handle<void>, boost::capy::io_env const*) :150 0 100.0% 0.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::select_t{}>::testInnerErrorPassesThrough()::erroring_awaitable>::await_suspend(std::__1::coroutine_handle<void>, boost::capy::io_env const*) :150 1x 100.0% 37.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::select_t{}>::testInnerExceptionPropagates()::throwing_awaitable>::await_suspend(std::__1::coroutine_handle<void>, boost::capy::io_env const*) :150 1x 100.0% 37.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::select_t{}>::testReadyInnerCanceledNotRemapped()::ready_canceled_awaitable>::await_suspend(std::__1::coroutine_handle<void>, boost::capy::io_env const*) :150 0 95.0% 26.5% 0.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::select_t{}>::testReadyInnerCompletesWithoutSuspend()::ready_awaitable>::await_suspend(std::__1::coroutine_handle<void>, boost::capy::io_env const*) :150 0 100.0% 0.0% boost::corosio::detail::timeout_awaitable<auto boost::capy::any_read_stream::read_some<boost::capy::mutable_buffer>(boost::capy::mutable_buffer)::awaitable>::await_resume() :211 6x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<auto boost::capy::any_write_stream::write_some<boost::capy::const_buffer>(boost::capy::const_buffer)::awaitable>::await_resume() :211 2x 100.0% 57.0% boost::corosio::detail::timeout_awaitable<boost::capy::task<std::__1::tuple<std::__1::error_code, int>>>::await_resume() :211 2x 100.0% 85.0% boost::corosio::detail::timeout_awaitable<boost::corosio::delay_awaitable>::await_resume() :211 2023x 100.0% 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::detail::timeout_awaitable<auto boost::capy::any_read_stream::read_some<boost::capy::mutable_buffer>(boost::capy::mutable_buffer)::awaitable>>::await_resume() :211 2x 100.0% 57.0% boost::corosio::detail::timeout_awaitable<boost::corosio::detail::timeout_awaitable<boost::corosio::delay_awaitable>>::await_resume() :211 2x 100.0% 57.0% boost::corosio::detail::timeout_awaitable<boost::corosio::io_read_stream::read_some_awaitable<boost::capy::mutable_buffer>>::await_resume() :211 3x 92.3% 50.0% 85.0% boost::corosio::detail::timeout_awaitable<boost::corosio::payload_awaitable>::await_resume() :211 2x 100.0% 57.0% boost::corosio::detail::timeout_awaitable<boost::corosio::tcp_socket::connect_awaitable>::await_resume() :211 1x 69.2% 50.0% 71.0% boost::corosio::detail::timeout_awaitable<boost::corosio::tcp_socket::wait_awaitable>::await_resume() :211 1x 92.3% 50.0% 85.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::kqueue_t{}>::testInnerErrorPassesThrough()::erroring_awaitable>::await_resume() :211 1x 100.0% 57.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::kqueue_t{}>::testInnerExceptionPropagates()::throwing_awaitable>::await_resume() :211 0 100.0% 0.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::kqueue_t{}>::testReadyInnerCanceledNotRemapped()::ready_canceled_awaitable>::await_resume() :211 1x 100.0% 57.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::kqueue_t{}>::testReadyInnerCompletesWithoutSuspend()::ready_awaitable>::await_resume() :211 1x 100.0% 57.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::select_t{}>::testInnerErrorPassesThrough()::erroring_awaitable>::await_resume() :211 1x 100.0% 57.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::select_t{}>::testInnerExceptionPropagates()::throwing_awaitable>::await_resume() :211 0 100.0% 0.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::select_t{}>::testReadyInnerCanceledNotRemapped()::ready_canceled_awaitable>::await_resume() :211 1x 100.0% 32.3% 57.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::select_t{}>::testReadyInnerCompletesWithoutSuspend()::ready_awaitable>::await_resume() :211 1x 100.0% 57.0% boost::corosio::detail::timeout_awaitable<auto boost::capy::any_read_stream::read_some<boost::capy::mutable_buffer>(boost::capy::mutable_buffer)::awaitable>::destroy_parent_cb() :250 20x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<auto boost::capy::any_write_stream::write_some<boost::capy::const_buffer>(boost::capy::const_buffer)::awaitable>::destroy_parent_cb() :250 6x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::capy::task<std::__1::tuple<std::__1::error_code, int>>>::destroy_parent_cb() :250 6x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::delay_awaitable>::destroy_parent_cb() :250 6072x 100.0% 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::detail::timeout_awaitable<auto boost::capy::any_read_stream::read_some<boost::capy::mutable_buffer>(boost::capy::mutable_buffer)::awaitable>>::destroy_parent_cb() :250 6x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::detail::timeout_awaitable<boost::corosio::delay_awaitable>>::destroy_parent_cb() :250 6x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::io_read_stream::read_some_awaitable<boost::capy::mutable_buffer>>::destroy_parent_cb() :250 9x 100.0% 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::payload_awaitable>::destroy_parent_cb() :250 8x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::tcp_socket::connect_awaitable>::destroy_parent_cb() :250 3x 100.0% 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::tcp_socket::wait_awaitable>::destroy_parent_cb() :250 3x 100.0% 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::kqueue_t{}>::testInnerErrorPassesThrough()::erroring_awaitable>::destroy_parent_cb() :250 3x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::kqueue_t{}>::testInnerExceptionPropagates()::throwing_awaitable>::destroy_parent_cb() :250 2x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::kqueue_t{}>::testReadyInnerCanceledNotRemapped()::ready_canceled_awaitable>::destroy_parent_cb() :250 3x 100.0% 66.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::kqueue_t{}>::testReadyInnerCompletesWithoutSuspend()::ready_awaitable>::destroy_parent_cb() :250 3x 100.0% 66.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::select_t{}>::testInnerErrorPassesThrough()::erroring_awaitable>::destroy_parent_cb() :250 3x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::select_t{}>::testInnerExceptionPropagates()::throwing_awaitable>::destroy_parent_cb() :250 2x 100.0% 100.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::select_t{}>::testReadyInnerCanceledNotRemapped()::ready_canceled_awaitable>::destroy_parent_cb() :250 3x 100.0% 81.2% 66.0% boost::corosio::detail::timeout_awaitable<boost::corosio::timeout_test<boost::corosio::select_t{}>::testReadyInnerCompletesWithoutSuspend()::ready_awaitable>::destroy_parent_cb() :250 3x 100.0% 66.0%
Line Branch TLA Hits Source Code
1 //
2 // Copyright (c) 2026 Steve Gerbino
3 //
4 // Distributed under the Boost Software License, Version 1.0. (See accompanying
5 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 //
7 // Official repository: https://github.com/cppalliance/corosio
8 //
9
10 #ifndef BOOST_COROSIO_DETAIL_TIMEOUT_AWAITABLE_HPP
11 #define BOOST_COROSIO_DETAIL_TIMEOUT_AWAITABLE_HPP
12
13 #include <boost/corosio/io_context.hpp>
14 #include <boost/corosio/detail/timeout_coro.hpp>
15 #include <boost/corosio/detail/timer.hpp>
16 #include <boost/corosio/detail/except.hpp>
17 #include <boost/capy/cond.hpp>
18 #include <boost/capy/error.hpp>
19 #include <boost/capy/ex/io_env.hpp>
20 #include <boost/capy/io_result.hpp>
21
22 #include <chrono>
23 #include <coroutine>
24 #include <new>
25 #include <optional>
26 #include <stdexcept>
27 #include <stop_token>
28 #include <type_traits>
29 #include <utility>
30
31 /* Races an inner IoAwaitable against a timer via a shared
32 stop_source. await_suspend arms the timer by launching a
33 fire-and-forget timeout_coro, then starts the inner op with
34 an interposed stop_token. Whichever completes first signals
35 the stop_source, cancelling the other.
36
37 Parent cancellation is forwarded through a stop_callback
38 stored in a placement-new buffer (stop_callback is not
39 movable, but the awaitable must be movable for
40 transform_awaiter). The buffer is inert during moves
41 (before await_suspend) and constructed in-place once the
42 awaitable is pinned on the coroutine frame.
43
44 The timeout_coro can outlive this awaitable — it owns its
45 env and self-destroys via suspend_never. The timer lives in
46 std::optional and is constructed lazily in await_suspend,
47 once the awaiting coroutine's executor context is known. */
48
49 namespace boost::corosio::detail {
50
51 // Local stand-in for capy::detail's io_result trait: corosio must not
52 // reach into capy::detail, but the result-mapping switch in
53 // await_resume needs to distinguish io_result from other return types.
54 template<typename T>
55 struct is_io_result : std::false_type
56 {
57 };
58
59 template<typename... Ts>
60 struct is_io_result<capy::io_result<Ts...>> : std::true_type
61 {
62 };
63
64 template<typename T>
65 inline constexpr bool is_io_result_v = is_io_result<T>::value;
66
67 /** Awaitable adapter that cancels an inner operation after a deadline.
68
69 Races the inner awaitable against a timer. A shared stop_source
70 ties them together: whichever completes first cancels the other.
71 Parent cancellation is forwarded via stop_callback.
72
73 The timer is constructed internally in `await_suspend` from the
74 execution context in `io_env`.
75
76 @tparam A The inner IoAwaitable type (decayed).
77 */
78 template<typename A>
79 struct timeout_awaitable
80 {
81 struct stop_forwarder
82 {
83 std::stop_source* src_;
84 2004x void operator()() const noexcept
85 {
86 2004x src_->request_stop();
87 2004x }
88 };
89
90 using time_point = std::chrono::steady_clock::time_point;
91 using stop_cb_type = std::stop_callback<stop_forwarder>;
92
93 A inner_;
94 std::optional<timer> timer_;
95 time_point deadline_;
96 4x std::chrono::nanoseconds dur_{};
97 4x bool has_deadline_ = true;
98 std::stop_source stop_src_;
99 std::stop_token parent_token_;
100 capy::io_env inner_env_;
101 alignas(stop_cb_type) unsigned char cb_buf_[sizeof(stop_cb_type)];
102 4117x bool cb_active_ = false;
103
104 /// Construct without a timer, deadline given as an absolute time.
105
3/6
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
16x timeout_awaitable(A&& inner, time_point deadline)
106 4x : inner_(std::move(inner))
107 4x , deadline_(deadline)
108 4x {
109 8x }
110
111 /// Construct without a timer, deadline measured from suspension.
112
51/96
✓ Branch 0 taken 2026 times.
✓ Branch 1 taken 1 time.
✓ Branch 2 taken 2026 times.
✓ Branch 3 taken 1 time.
✓ Branch 4 taken 2025 times.
✓ Branch 5 taken 1 time.
✓ Branch 6 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 time.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 time.
✗ Branch 17 not taken.
✓ Branch 18 taken 4 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 4 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 4 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 time.
✗ Branch 25 not taken.
✓ Branch 26 taken 1 time.
✗ Branch 27 not taken.
✓ Branch 28 taken 1 time.
✗ Branch 29 not taken.
✓ Branch 30 taken 1 time.
✗ Branch 31 not taken.
✓ Branch 32 taken 1 time.
✗ Branch 33 not taken.
✓ Branch 34 taken 1 time.
✗ Branch 35 not taken.
✓ Branch 36 taken 2 times.
✗ Branch 37 not taken.
✓ Branch 38 taken 2 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 2 times.
✗ Branch 41 not taken.
✓ Branch 42 taken 2 times.
✗ Branch 43 not taken.
✓ Branch 44 taken 2 times.
✗ Branch 45 not taken.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✓ Branch 48 taken 2 times.
✗ Branch 49 not taken.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✓ Branch 54 taken 6 times.
✗ Branch 55 not taken.
✓ Branch 56 taken 6 times.
✗ Branch 57 not taken.
✓ Branch 58 taken 6 times.
✗ Branch 59 not taken.
✓ Branch 60 taken 2 times.
✗ Branch 61 not taken.
✓ Branch 62 taken 2 times.
✗ Branch 63 not taken.
✓ Branch 64 taken 2 times.
✗ Branch 65 not taken.
✓ Branch 66 taken 2 times.
✗ Branch 67 not taken.
✓ Branch 68 taken 2 times.
✗ Branch 69 not taken.
✓ Branch 70 taken 2 times.
✗ Branch 71 not taken.
✓ Branch 72 taken 1 time.
✗ Branch 73 not taken.
✓ Branch 74 taken 1 time.
✗ Branch 75 not taken.
✓ Branch 76 taken 1 time.
✗ Branch 77 not taken.
✓ Branch 78 taken 1 time.
✗ Branch 79 not taken.
✓ Branch 80 taken 1 time.
✗ Branch 81 not taken.
✓ Branch 82 taken 1 time.
✗ Branch 83 not taken.
✓ Branch 84 taken 1 time.
✗ Branch 85 not taken.
✓ Branch 86 taken 1 time.
✗ Branch 87 not taken.
✓ Branch 88 taken 1 time.
✗ Branch 89 not taken.
✓ Branch 90 taken 1 time.
✗ Branch 91 not taken.
✓ Branch 92 taken 1 time.
✗ Branch 93 not taken.
✓ Branch 94 taken 1 time.
✗ Branch 95 not taken.
6165x timeout_awaitable(A&& inner, std::chrono::nanoseconds dur)
113 2055x : inner_(std::move(inner))
114 2054x , dur_(dur)
115 2054x , has_deadline_(false)
116 2055x {
117 4110x }
118
119 8235x ~timeout_awaitable()
120 4118x {
121 4117x destroy_parent_cb();
122 8235x }
123
124 // Only moved before await_suspend, when cb_active_ is false
125 6180x timeout_awaitable(timeout_awaitable&& o) noexcept(
126 std::is_nothrow_move_constructible_v<A>)
127 2060x : inner_(std::move(o.inner_))
128 2060x , timer_(std::move(o.timer_))
129 2060x , deadline_(o.deadline_)
130 2060x , dur_(o.dur_)
131 2060x , has_deadline_(o.has_deadline_)
132 2060x , stop_src_(std::move(o.stop_src_))
133 2060x {
134 4120x }
135
136 timeout_awaitable(timeout_awaitable const&) = delete;
137 timeout_awaitable& operator=(timeout_awaitable const&) = delete;
138 timeout_awaitable& operator=(timeout_awaitable&&) = delete;
139
140 // Forwarding here is load-bearing, not an optimization: awaitables
141 // may perform setup in await_ready (type-erased stream wrappers
142 // construct their cached inner op there), so the full awaiter
143 // protocol must reach inner_ before await_suspend is driven. An
144 // already-ready inner op also skips arming the timer entirely.
145 2055x bool await_ready()
146 {
147 2055x return inner_.await_ready();
148 }
149
150 2054x auto await_suspend(std::coroutine_handle<> h, capy::io_env const* env)
151 {
152 2054x parent_token_ = env->stop_token;
153
154 // The deadline timer is built here from the awaiting
155 // coroutine's executor context, the first point at which it
156 // is known. await_suspend is driven through a noexcept
157 // wrapper, so a failure cannot be surfaced as a catchable
158 // exception. An executor whose context is not an io_context
159 // cannot supply a timer service; silently running the
160 // operation with no deadline would be a worse failure than
161 // aborting, so translate the service-lookup error into a
162 // clear precondition diagnostic. This terminates by design
163 // (a usage error) rather than dropping the requested timeout.
164 // The detached timeout coroutine must own its executor by
165 // value (see timeout_coro::set_env_owned); io_env carries
166 // only a non-owning executor_ref. Recover the concrete
167 // executor from the context rather than the executor_ref:
168 // wrapped executors (a strand over the io_context) satisfy
169 // the documented precondition but do not expose the io
170 // executor as their target. The timer construction below
171 // validates the context is an io_context, and the detached
172 // coroutine shares only the thread-safe stop_source with
173 // the caller, so resuming it on the raw io executor instead
174 // of the caller's wrapper is safe.
175 try
176 {
177
13/32
✓ Branch 0 taken 2030 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 time.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 time.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 6 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 2 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 time.
✗ Branch 25 not taken.
✓ Branch 26 taken 1 time.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
2054x timer_.emplace(env->executor.context());
178 2056x }
179 catch (std::logic_error const&)
180 {
181
1/32
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
2x throw_logic_error(
182 "timeout requires an io_context-backed executor");
183 2x }
184 auto ex = static_cast<io_context&>(
185 2052x env->executor.context()).get_executor();
186
187
13/32
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 2026 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 time.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 time.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 6 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 1 time.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 time.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
2052x if (has_deadline_)
188 4x timer_->expires_at(deadline_);
189 else
190 2048x timer_->expires_after(dur_);
191
192 // Launch fire-and-forget timeout (starts suspended)
193
12/32
✓ Branch 0 taken 2030 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 time.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 time.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 6 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 2 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 time.
✗ Branch 25 not taken.
✓ Branch 26 taken 1 time.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
2052x auto timeout = make_timeout(*timer_, stop_src_);
194
2/4
✓ Branch 0 taken 2030 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2030 times.
✗ Branch 3 not taken.
4104x timeout.h_.promise().set_env_owned(
195 2052x ex, stop_src_.get_token(), env->frame_allocator);
196 // Runs synchronously until timer.wait() suspends
197 2052x timeout.h_.resume();
198 // timeout goes out of scope; destructor is a no-op,
199 // the coroutine self-destroys via suspend_never
200
201 // Forward parent cancellation
202 2052x new (cb_buf_) stop_cb_type(env->stop_token, stop_forwarder{&stop_src_});
203 2052x cb_active_ = true;
204
205 // Start the inner op with our interposed stop_token
206 8208x inner_env_ = {
207 6156x env->executor, stop_src_.get_token(), env->frame_allocator};
208 2052x return inner_.await_suspend(h, &inner_env_);
209 4x }
210
211 2050x decltype(auto) await_resume()
212 {
213 // Read before request_stop: afterwards stop_requested()
214 // can no longer distinguish who fired first. This must also
215 // happen before inner_.await_resume() rather than after: when
216 // the inner awaitable is itself a timeout_awaitable (nested
217 // timeout()), our own request_stop() below is visible through
218 // its parent_token_ (aliasing our stop_src_), and would
219 // otherwise make its read of "parent" look like a
220 // cancellation that never happened.
221 2050x bool const parent = parent_token_.stop_requested();
222 2050x bool const fired = stop_src_.stop_requested();
223
224 // If inner_.await_resume() throws below, request_stop() is
225 // skipped; the still-armed timeout coroutine is then drained
226 // by timer_'s destructor rather than by us.
227 2050x auto r = inner_.await_resume();
228
229 // Cancel whichever is still pending (idempotent)
230 2050x stop_src_.request_stop();
231 2050x destroy_parent_cb();
232
233 // Deadline won: stop_src_ is assumed to be the only
234 // cancellation source, whose only writers are the timer
235 // coroutine and the parent forwarder, so fired && !parent
236 // identifies a timeout. A third-party cancellation of the
237 // inner op (e.g. a socket cancel issued from elsewhere)
238 // landing in the same window as the deadline firing is
239 // reported as a timeout.
240
37/96
✓ Branch 0 taken 2022 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2004 times.
✓ Branch 3 taken 18 times.
✓ Branch 4 taken 18 times.
✓ Branch 5 taken 2008 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 time.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 1 time.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 time.
✗ Branch 30 not taken.
✓ Branch 31 taken 1 time.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✓ Branch 35 taken 1 time.
✓ Branch 36 taken 2 times.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✓ Branch 39 taken 2 times.
✓ Branch 40 taken 2 times.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✓ Branch 43 taken 2 times.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✓ Branch 47 taken 2 times.
✓ Branch 48 taken 2 times.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✓ Branch 51 taken 2 times.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✓ Branch 54 taken 2 times.
✓ Branch 55 taken 4 times.
✗ Branch 56 not taken.
✓ Branch 57 taken 2 times.
✓ Branch 58 taken 2 times.
✓ Branch 59 taken 4 times.
✗ Branch 60 not taken.
✓ Branch 61 taken 2 times.
✗ Branch 62 not taken.
✗ Branch 63 not taken.
✗ Branch 64 not taken.
✓ Branch 65 taken 2 times.
✗ Branch 66 not taken.
✓ Branch 67 taken 2 times.
✗ Branch 68 not taken.
✗ Branch 69 not taken.
✗ Branch 70 not taken.
✓ Branch 71 taken 2 times.
✗ Branch 72 not taken.
✓ Branch 73 taken 1 time.
✗ Branch 74 not taken.
✗ Branch 75 not taken.
✗ Branch 76 not taken.
✓ Branch 77 taken 1 time.
✗ Branch 78 not taken.
✗ Branch 79 not taken.
✗ Branch 80 not taken.
✗ Branch 81 not taken.
✗ Branch 82 not taken.
✗ Branch 83 not taken.
✗ Branch 84 not taken.
✓ Branch 85 taken 1 time.
✗ Branch 86 not taken.
✗ Branch 87 not taken.
✗ Branch 88 not taken.
✓ Branch 89 taken 1 time.
✗ Branch 90 not taken.
✓ Branch 91 taken 1 time.
✗ Branch 92 not taken.
✗ Branch 93 not taken.
✗ Branch 94 not taken.
✓ Branch 95 taken 1 time.
2074x if (fired && !parent &&
241 24x std::get<0>(r) == capy::cond::canceled)
242 {
243 24x std::remove_cvref_t<decltype(r)> t{};
244 24x std::get<0>(t) = make_error_code(capy::error::timeout);
245 24x return t;
246 }
247 2026x return r;
248 2050x }
249
250 6161x void destroy_parent_cb() noexcept
251 {
252
28/32
✓ Branch 0 taken 4052 times.
✓ Branch 1 taken 2029 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 1 time.
✓ Branch 4 taken 1 time.
✓ Branch 5 taken 1 time.
✓ Branch 6 taken 6 times.
✓ Branch 7 taken 2 times.
✓ Branch 8 taken 3 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 3 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 4 times.
✓ Branch 13 taken 2 times.
✓ Branch 14 taken 4 times.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 4 times.
✓ Branch 17 taken 2 times.
✓ Branch 18 taken 14 times.
✓ Branch 19 taken 6 times.
✓ Branch 20 taken 4 times.
✓ Branch 21 taken 2 times.
✓ Branch 22 taken 4 times.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✓ Branch 25 taken 1 time.
✓ Branch 26 taken 1 time.
✓ Branch 27 taken 1 time.
✓ Branch 28 taken 3 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 3 times.
✗ Branch 31 not taken.
6161x if (cb_active_)
253 {
254 2051x std::launder(reinterpret_cast<stop_cb_type*>(cb_buf_))
255 2051x ->~stop_cb_type();
256 2051x cb_active_ = false;
257 2051x }
258 6161x }
259 };
260
261 } // namespace boost::corosio::detail
262
263 #endif
264