include/boost/corosio/detail/dispatch_coro.hpp

100.0% Lines (5 / 5) 66.7% Branches (4 / 6) 100.0% Functions (1 / 1)
dispatch_coro.hpp
f(x) Functions (1)
Line Branch TLA Hits Source Code
1 //
2 // Copyright (c) 2026 Vinnie Falco ([email protected])
3 // Copyright (c) 2026 Steve Gerbino
4 //
5 // Distributed under the Boost Software License, Version 1.0. (See accompanying
6 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7 //
8 // Official repository: https://github.com/cppalliance/corosio
9 //
10
11 #ifndef BOOST_COROSIO_DETAIL_DISPATCH_CORO_HPP
12 #define BOOST_COROSIO_DETAIL_DISPATCH_CORO_HPP
13
14 #include <boost/corosio/io_context.hpp>
15 #include <boost/capy/continuation.hpp>
16 #include <boost/capy/ex/executor_ref.hpp>
17 #include <boost/capy/detail/type_id.hpp>
18 #include <coroutine>
19
20 namespace boost::corosio::detail {
21
22 /** Returns a handle for symmetric transfer on I/O completion.
23
24 Returns `c.h` when the executor's context is running on the
25 calling thread, so the awaiter resumes by symmetric transfer.
26 Otherwise the executor queues `c` and `noop_coroutine()` is
27 returned. An `io_context` executor is dispatched without type
28 erasure.
29
30 Callers in coroutine machinery should return the result
31 for symmetric transfer. Callers at the scheduler pump
32 level should call `.resume()` on the result.
33
34 @note A `dispatch` that throws calls `std::terminate`.
35
36 @param ex The executor to dispatch through.
37 @param c The continuation to dispatch. Must remain at a
38 stable address until dequeued by the executor.
39
40 @return A handle for symmetric transfer or `std::noop_coroutine()`.
41 */
42 inline std::coroutine_handle<>
43 1428557x dispatch_coro(capy::executor_ref ex, capy::continuation& c) noexcept
44 {
45 // An exception from dispatch would leave the completed operation
46 // with nobody to resume or abandon its coroutine.
47 // A completion from another context must not resume the awaiter
48 // on this thread, so the fast path still asks the executor.
49
2/2
✓ Branch 0 taken 6524 times.
✓ Branch 1 taken 1422033 times.
1428557x if (auto const* io_ex = ex.target<io_context::executor_type>())
50
1/2
✓ Branch 0 taken 1422033 times.
✗ Branch 1 not taken.
1422033x return io_ex->dispatch(c);
51
1/2
✓ Branch 0 taken 6524 times.
✗ Branch 1 not taken.
6524x return ex.dispatch(c);
52 1428557x }
53
54 } // namespace boost::corosio::detail
55
56 #endif
57