libev/libuv interoperation with ev_async

Marc Lehmann schmorp at
Tue Dec 1 04:55:45 CET 2020

On Mon, Nov 30, 2020 at 10:47:24PM +0300, Mons Anderson <mons at> wrote:
> Every thread works in cooperative multitasking mode
> (
> For networking with clients created a separate, net thread
> (
> Communication between threads works using cbus and cpipe
> (
> which in fact are wrappers on top of ev_async

Quite interesting!

> With current state one could create a module using ev backend, since ev_async
> is fully supported by libev. But if worker thread must run another event loop
> there is no good option for how to run, for ex pure select or libuv on top of
> running libev loop

It's still not quite clear to me what you are trying to achieve - so you have
a worker thread that uses libuv, and you somehow want to integrate this into
your main libev loop.

How does the communication work though? Do you want to wake up an uv loop
that the worker is blocking in, or the main ev loop from a uv thread? Or,
likely, something else?

Do you want to write to the evpipe, or read from it? The equivalent of
writing to it can already be done by using ev_async_send. Reading from it
makes no sense, as whether the pipe has something to read or not depends
on the state of libev, it does not signify pending asyncs.

> I know, there are a lot of options for mutual integrations of event loops with
> AnyEvent, EV and other event loops in the world of Perl. I hope to find
> something like that for libev in the C world ;)

Not really, AnyEvent just solves the problem of your loop-agnostic code
running with any event loop, i.e. it allows you to write e.g. perl libraries
that do not depend on a specific event loop.

While AnyEvent+Coro can be used for a lot of tricks in running multiple
event loops, they don't do this by themselves, and there is no generic
recipe to do so.

> >    #include "ev.c"
> >
> >    ... code can now read evpipe, so you can define a function here.
> >
> > But for this to work reliably you probably have to patch libev anyway, to
> > make evpipe signal async sends reliably.
> We'll try to test such an approach. (In my small test snippet it seems to work)

I assume you mean accessing evpipe - but accessing evpipe is only one
part, you have to find out what semantics you want from evpipe, and likely
patch libev to provide these semantics, for example, making sure libev
actually allocates a pipe and write for every ev_async_send, neither of
which libev does at the moment.

                The choice of a       Deliantra, the free code+content MORPG
      -----==-     _GNU_    
      ----==-- _       generation
      ---==---(_)__  __ ____  __      Marc Lehmann
      --==---/ / _ \/ // /\ \/ /      schmorp at
      -=====/_/_//_/\_,_/ /_/\_\

More information about the libev mailing list