LCOV - code coverage report
Current view: top level - corosio/detail - dispatch_coro.hpp (source / functions) Coverage Total Hit
Test: coverage_remapped.info Lines: 100.0 % 4 4
Test Date: 2026-10-17 04:01:32 Functions: 100.0 % 1 1

           TLA  Line data    Source code
       1                 : //
       2                 : // Copyright (c) 2026 Vinnie Falco (vinnie.falco@gmail.com)
       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 HIT      490548 : 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          490548 :     if (auto const* io_ex = ex.target<io_context::executor_type>())
      50          489417 :         return io_ex->dispatch(c);
      51            1131 :     return ex.dispatch(c);
      52                 : }
      53                 : 
      54                 : } // namespace boost::corosio::detail
      55                 : 
      56                 : #endif
        

Generated by: LCOV version 2.3