On Tue, Dec 29, 2009 at 01:20:53PM +0100, Pierre-Yves Kerembellec 
<[email protected]> wrote:
> I'm quite new to libev and I'm having a hard time figuring out why a call to 
> ev_async_send() will not trigger the corresponding async handler
> in the specified target loop.

Any watcher, including an async watcher, must be started first. It will
likely work much better if you add an appropriate.

   ev_async_start (loop, &w);

> As you can see, the round-robin distribution to worker threads seems to be 
> fine, but the async_cb is never called. Despite the fact that
> I need to add a timer watcher to each worker thread loop (to keep in alive in 
> absence of any other), I've been digging a little but into the

Adding a timer is a possibility, another is to call ev_ref (loop).

> libev code and it seems the internal evpipe_init() function (responsible for 
> creating and initializing a communication eventfd/pipe
> watcher is actually never sent. ev_async_start() on the other end will call 
> evpipe_init(), but my understanding is that it's not thread-safe

Calling evpipe_init is indeed the job of ev_async_start.

> (because it's not using the communication pipe and changing directly the loop 
>  internal async table from another thread).

You have to start the watcher in the thread that waits for it.

> Am i missing something here ? Am I using the right workflow ?

Probably not - start the ev_async watcher in the thread that runs the
loop, then use ev_async_send from other threads.

Whether you then use one async watcher per thread or just one globally (or
something else) is then a matter of design.

> For now, I'm back at using my own pipes between the main and the worker 
> threads, adding an ev_io watcher to the reading side of each
> pipe, and writing accepted network handles to the pipes in a round-robin way 
> (like the above). I actually mimic the ev_async_send()
> behavior, and it works quite fine. But I'd really like to use the provided 
> libev async facility if possible, instead of re-inventing the wheel
> in my code.

Indeed, it will also likely be faster.

-- 
                The choice of a       Deliantra, the free code+content MORPG
      -----==-     _GNU_              http://www.deliantra.net
      ----==-- _       generation
      ---==---(_)__  __ ____  __      Marc Lehmann
      --==---/ / _ \/ // /\ \/ /      [email protected]
      -=====/_/_//_/\_,_/ /_/\_\

_______________________________________________
libev mailing list
[email protected]
http://lists.schmorp.de/cgi-bin/mailman/listinfo/libev

Reply via email to