Re: [Capy review] Some questions

Steve Gerbino via Boost <[email protected]> Thu, 25 Jun 2026 13:05:08 +0000
Newsgroups gmane.comp.lib.boost.devel
Message-ID <wm-ZAywqAQuqNCPtC77BN9K1L4jtiYj2xDhJnSB_cP3055FhlZnz8rH8KkOOEjX8k_4fQNxx2e-asgb_gEI9Nn8OOApbHySgwb8qYPw4DLA=@gerbino.co>



On Thursday, June 25th, 2026 at 12:58 PM, Ruben Perez via Boost <[email protected]> wrote:

> >>
> >> asio::awaitable<void> co_main()
> >> {
> >>     auto exec = capy::wrap_asio_executor(co_await asio::this_coro::executor);
> >>     co_await capy::asio_spawn(exec, my_capy_task());
> >> }
> >>
> >> Out of curiosity, how does the out-of-the-box Corosio integration
> >> work? I mean, the example uses asio::io_context::run(). How does this
> >> get to service Corosio's reactor?
> >
> >
> > You create a service through the asio executor that contains a capy::execution_context - and vice versa.
> > When the corosio::socket then gets the scheduler from this context, the scheduler *should* create a thread for the reactor.
> > Then, the completion would do a dispatch back onto the asio executor.
> >
> > The above isn't clearly defined in capy yet, which is another reason it's not merged at this point.
> 
> I've tried the following and it fails:
> 
> capy::task<void> capy_work(int i)
> {
>    std::cout << "Capy task started\n";
>    corosio::tcp_socket sock{co_await capy::this_coro::executor};
>    auto [ec] = co_await sock.connect(corosio::endpoint("127.0.0.1:8000"));
>    std::cout << "Capy task: " << i << ": " << ec << std::endl;
>    co_return;
> }
> 
> net::awaitable<void> co_main()
> {
>    std::cout << "co_main\n";
>    auto exec = capy::wrap_asio_executor(co_await net::this_coro::executor);
>    co_await capy::asio_spawn(exec, capy_work(42));
>    std::cout << "co_main finished\n";
> }
> 
> int main()
> {
>    net::io_context ctx;
> 
>    net::co_spawn(ctx, co_main(), [](std::exception_ptr exc) {
>       if (exc)
>          std::rethrow_exception(exc);
>    });
> 
>    ctx.run();
> }
> 
> With the following output:
> 
> co_main
> Capy task started
> terminate called after throwing an instance of 'std::logic_error'
>   what():  io_object::create_handle: service not installed
> Aborted (core dumped)
> 
> Looking at the code, corosio I/O objects don't create any services by
> default, but require these to be already installed in the execution
> context that you passed. This happens in corosio::io_context
> constructor.
> 
> This means that this also fails:
> 
> capy::task<void> co_main()
> {
>    std::cout << "Capy task started\n";
>    corosio::tcp_socket sock{co_await capy::this_coro::executor};
>    auto [ec] = co_await sock.connect(corosio::endpoint("127.0.0.1:8000"));
>    std::cout << "Capy task finished: " << ec << std::endl;
>    co_return;
> }
> 
> int main()
> {
>    capy::thread_pool ctx{4};
> 
>    capy::run_async(
>       ctx.get_executor(),
>       []() {
>          std::cout << "Done\n";
>       },
>       [](std::exception_ptr exc) {
>          try {
>             std::rethrow_exception(exc);
>          } catch (const std::exception& e) {
>             std::cerr << "Error: " << e.what() << std::endl;
>          }
>          exit(1);
>       })(co_main());
> 
>    ctx.join();
> }
> 
> Which makes me think that Corosio can only be used with
> corosio::io_context, and no other execution contexts.

That is correct, for now. The Boost.Asio compatibility is not part of Capy *yet*. It is un-reviewed and not merged. To support this we simply lazily load services.
_______________________________________________
Boost mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://lists.boost.org/mailman3/lists/boost.lists.boost.org/
Archived at: https://lists.boost.org/archives/list/[email protected]/message/53IUH5KIQCQMYSRJLH5C7DWV7I5TRRHD/