[HN Gopher] C++20 Coroutines and Io_uring
       ___________________________________________________________________
        
       C++20 Coroutines and Io_uring
        
       Author : signa11
       Score  : 17 points
       Date   : 2022-11-13 15:17 UTC (7 hours ago)
        
 (HTM) web link (pabloariasal.github.io)
 (TXT) w3m dump (pabloariasal.github.io)
        
       | gavinray wrote:
       | Hey just a heads up -- you're setting the queue depth of the ring
       | to the number of files discovered, that's typically not the way
       | you'd want to size the ring.
       | 
       | When you start to get up into higher queue depths, like
       | 512-1,024, you benefit a lot from using flags like
       | IORING_SETUP_SQPOLL.
       | 
       | If you're going to do a thread pool too, you may as well use
       | IORING_WQ_ATTACH and put a ring on each thread that shares a
       | single kernel poller, see the SO explanation I gave recently
       | here:
       | 
       | https://stackoverflow.com/questions/73798651/how-to-create-a...
        
       | max_k wrote:
       | I love C++ coroutines! (The spec has a few warts and gives me
       | enough reasons to hate them, like not being able by definition to
       | properly inline nested coroutine calls, but I love them anyway.)
       | 
       | I've written several libraries for integrating C++ coroutines
       | with stuff like io_uring, libcurl, c_ares, libpq and more. For
       | example, this is how using my io_uring/coroutine library can be
       | used:
       | https://github.com/CM4all/libcommon/blob/master/test/co/RunC...
       | auto result = co_await CoReadTextFile(queue, AT_FDCWD, path);
       | co_await CoWrite(queue, STDOUT_FILENO, result.data(),
       | result.size(), 0);
       | 
       | This opens a file, stats it, reads its contents, and writes it to
       | stdout - all 4 I/O operations are asynchronous with io_uring.
       | Source code for CoReadTextFile() which is also a coroutine:
       | https://github.com/CM4all/libcommon/blob/master/src/io/uring...
       | 
       | Sample code for libpq:
       | https://github.com/CM4all/libcommon/blob/master/test/co/RunC...
       | and c_ares
       | https://github.com/CM4all/libcommon/blob/master/test/co/RunC...
       | and libcurl
       | https://github.com/CM4all/libcommon/blob/master/test/curl/Ru...
       | 
       | I wrote all of this for proprietary applications at dayjob, but
       | the core library is open source, as is much of my dayjob code.
       | The I/O event loop this integrates with is also used by several
       | open source projects I maintain, e.g. the Music Player Daemon
       | (https://github.com/MusicPlayerDaemon/MPD/tree/master/src/eve...)
       | which can also take advantage of io_uring, though not (yet) with
       | coroutines, only "classic" non-blocking I/O.
       | 
       | My code is optimized for low-overhead; the very core doesn't even
       | use std::function because I fear its implicit heap allocations.
       | Long ago, I used boost::asio (which also integrates well with
       | coroutines) but didn't like it because it was too bloated for me.
       | 
       | I've rarely seen other nerds talk about C++ coroutines, and never
       | about integrating them with io_uring, made me thinking I'm the
       | only one. But maybe all the others just don't write/blog about it
       | - I never did either... That's why this blog was a refreshing
       | read for me, thanks.
        
         | pencilguin wrote:
         | Others have integrated io_uring with asio, and asio with co-
         | routines. The performance is about the same. The complexity is
         | a matter of taste: asio offers lots built in that you would
         | need to code yourself for the next project.
         | 
         | I generally lean toward lower total complexity at cost if more
         | custom coding, but it is a big tent.
        
         | mrfox321 wrote:
         | All new c++ code I work with at bigco are c++ coroutines.
         | 
         | The underlying executors come from folly.
        
       ___________________________________________________________________
       (page generated 2022-11-13 23:02 UTC)