Re: [Capy/Corosio review]

Steve Gerbino via Boost <[email protected]> Mon, 29 Jun 2026 14:01:41 +0000
Newsgroups gmane.comp.lib.boost.devel
Message-ID <4JdY8LuxeuYoM6rEHdsyi6opVtyl-uU6n1LRnJzmodrt-nSb3dmMsu_pF2e3nFn141tGQNBhlGc0vAC-aVwFcXr0ab-Be48Fd5Eue_io0eU=@gerbino.co>



On Monday, June 29th, 2026 at 3:47 PM, James Earnshaw via Boost <[email protected]> wrote:

> This is my formal review of the Capy and Corosio Libraries.
> 
> As context I have been working with the Capy and Corosio libraries for
> a period of four months as part of a coroutine migration effort. I
> have been involved in implementing various components of, and
> applications within a tier-1 financial market system (deployed on
> Linux) that has been in production for many years.
> 
> The platform currently uses Asio as an IO backbone, so using a library
> that mirrors the behaviour and performance of the Asio counterparts
> was important.
> 
> While this review is about the merits of Capy/Corosio, it is natural
> that much of it may reference Asio as a comparator given that it is
> our reference point for capability and performance given our existing
> codebase is entirely based on the Asio library (largely using
> callbacks).
> 
> Also note I come at this review from the position of a user picking up
> a new library as part of a refactoring and navigating that library
> based on the documentation and examples provided. I’m not trying to do
> anything too clever and have been able to fall-back on existing tests
> to assure behaviour (albeit updated to work with Capy/Corosio).
> 
> 
> *1. What is your evaluation of the usefulness of the libraries?*
> 
> My goal, by using these libraries, was to build simple coroutine
> scaffolding around pre-existing concepts within the codebase. This was
> made possible by a familiar API and strong documentation. The
> introductions provided a good high-level overview that allowed me,
> given my limited knowledge and experience with coroutines, to get up
> to speed quickly. These libraries will prove very useful for building
> effective coroutine-based applications.
> 
> I have used capy and corosio to write TCP/UDP servers and clients
> using each of the socket types, so the facilities provided by Corosio
> are exactly what I would expect from a networking library.
> 
> As an aside I should note that all my previous experience has been
> with Asio and callback code so while some may feel that style of code
> is hard to reason about I find it more intuitive, mainly because of my
> experiences to date.
> 
> This means, for example, that some coroutine specific patterns felt a
> little clunky or counter-intuitive at first. Not long after my first
> introduction to the libraries I attempted to rewrite some functions
> that execute a callback periodically when an asynchronous timer
> expires. This was when a new pattern was adopted: the periodic
> callback needs to be run in a loop, since the alternative, re-entering
> the same timer function indefinitely could result in a stack overflow.
> For me, initially, the callback style code felt easier to reason
> about.
> 
> I had a similar experience when refactoring server code that performs
> read and write tasks. While the new pattern of performing the
> asynchronous waits in a loop made the flow of the server easier to
> understand from a high-level perspective, doing this as part of a
> callback-chain felt more natural to me.
> 
> Why am I mentioning this as a general observation? Well because, as
> someone who might be more representative of a typical user coming from
> a callback-based Asio background they may face similar mental hurdles.
> However, and this is the point, despite this: the mental jump from
> callbacks to coroutines and then using a new library as well, I can
> say that the experience has been a good one. So none of this is a
> criticism, more just an observation that may lead to documentation
> improvements to better aid users like me.
> 
> No doubt there will be alternative patterns and approaches I should
> have taken but I haven’t looked into that in detail yet because I was
> able to get code working that delivered the same or better performance
> than the older implementation by using the documentation as a very
> accessible guide.
> 
> 
> *2. What is your evaluation of the design?*
> 
> The design of the library has been easy to use with limited background
> knowledge of C++20 coroutines. In terms of the facilities from Capy,
> having the capy-provided task type meant that coroutines could be
> composed and executed in parallel to make up small working projects
> with only few includes required.
> 
> Using run_async in more complicated code took some getting used to, in
> comparison to my experience of Asio’s callback approach using, for
> example, boost::asio::read_some( Socket, Callback ) where the
> execution of the async operation is also the code that runs after the
> operation is complete and no more than that.
> 
> Passing stop tokens through the coroutine stack automatically in the
> background makes cancellation a seamless task. Running child tasks
> within this stack is easy to orchestrate with the helpers e.g.
> capy::this_coro, for getting access to the environment where the stop
> token can be found.
> 
> So all-in-all, as advertised, this is more or less a familiar design
> to Asio but with a focus on being coroutine-first.
> 
> 
> *3. What is your evaluation of the implementation?*
> 
> My experience of the libraries is less of the implementation and more
> of the usage of the API, so I haven’t read a lot of the source code.
> 
> Anecdotally from a testing and behavioural point of view clearly the
> implementation is fit for purpose as all of our tests (refactored to
> allow both Asio and Capy/Corosio variants) passed and performed
> comparably or better, so no concerns here.
> 
> 
> *4. What is your evaluation of the documentation?*
> 
> The documentation is incredibly strong. The way they begin from first
> principles - networking, coroutine machinery and threading
> synchronisation etc., means that C++ developers can reference the
> documents for guidance on many related topics. A lot of canonical
> patterns are given. I found it was a simple task to adapt these to
> working code.
> 
> 
> *5. Have you used either or both libraries? What was your experience?*
> 
> Yes, as noted, I have used both libraries for a period of about 4
> months to-date. Prior to that I had no experience of working with
> coroutines in C++. As a result I very much appreciated that the
> documentation started from first principles of coroutines, allowing me
> to write my own awaiters and promises to get a handle on the
> machinery, before trying some of the same mock code with capy task and
> run_async.
> 
> Creating my own awaiter involved creating a sleeping thread that then
> posted the continuation on wake-up. To get this working I had to look
> at the capy::delay_awaitable to see what was done with the handle and
> io_env, so maybe the documentation could be improved for others
> wanting to create their own.
> 
> In trying to write more complex code I was tripped up by the lambda
> capture lifetime caused by temporary lambda tasks on multiple
> occasions. However the documentation has since been updated and
> explicitly warns users about this with sufficient detail to explain
> exactly what happens in this scenario, and proven alternatives.
> 
> In the time I have been using Capy/Corosio the documentation has
> continued to evolve as misunderstandings arise and can be addressed
> and this has supported (for me) a positive experience of using the
> libraries but more importantly the result of using the libraries has
> been working, production quality code.
> 
> 
> *6. Are the libraries ready for inclusion in Boost?*
> 
> Yes, the libraries are such that they provide all of the tools
> necessary to write coroutine code with networking facilities. For my
> use cases there is just one point to be made about the socket/endpoint
> interfaces which is mentioned below.
> 
> In short, for Asio, we write resolver.resolve(host_name, port) and
> then try each of the endpoints, each of which is potentially IPv4 or
> IPv6, until one of them works, keeping the application code
> independent of the particular IP version.
> 
> In some cases, it would be convenient if corosio supported a similar
> mechanism that would replace this style of application code:
> 
>     if( Endpoint.is_v4() )
>     {
>         Socket_.set_option
>           ( boost::corosio::socket_option
>               ::join_group_v4( Endpoint.v4_address() ) );
>     }
>     else
>     {
>         Socket_.set_option
>           ( boost::corosio::socket_option
>               ::join_group_v6( Endpoint.v6_address() ) );
>     }
> 
> with
> 
>     Socket_.set_option( boost::corosio::socket_option::join_group( Endpoint ) );
> 
> Having said that, this is not a blocker.
> 
> I haven’t looked into the test coverage on these libraries so cannot
> make any comments about this.
> 
> 
> *7. If not, what changes would you recommend before acceptance?*
> 
> Nothing that would be considered a blocker.
> 
> 
> *8. Do the libraries fit well within the existing Boost ecosystem?*
> 
> Yes, as a C++20 coroutine-first alternative to Asio. Capy in
> particular could serve as a basis for other IO library developers
> wishing to start from a foundation of coroutines if it was accepted
> alone (recognising that the review is to treat both libraries as a
> set).
> 
> 
> *9. Are there API, naming, usability, extensibility, or implementation
> concerns that should be addressed?*
> 
> I have no major concerns about the libraries. The authors have been
> quick to address and fix any issues encountered with use.
> 
> Our code would directly depend on native support for websockets. I
> have been told that this will be supported at a later date, but I
> cannot find any github issues or timelines backing this up.
> 
> 
> *Summary*
> 
> For the avoidance of doubt I vote to accept these libraries into Boost
> on the basis that for my use cases they have proved fit for purpose. I
> have no strong views on the APIs and proposed changes voiced in other
> reviews as I’ve been tracking an evolving API for a while now and have
> not encountered any blockers.
> _______________________________________________
> 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/YLT26KCU5JS3FIAUUORW3JVKACZNZRNY/
> 

Thank you kindly for the detailed review James.
_______________________________________________
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/7XV2AGMYW6I5Q2LEFAJKB72Q5ZF7VUR3/