On Thu, Jun 28, 2012 at 10:40 AM, Jorge <jo...@jorgechamorro.com> wrote:
> On 28/06/2012, at 08:22, Jeroen Janssen wrote:
>> On Jun 28, 1:18 am, Ben Noordhuis <i...@bnoordhuis.nl> wrote:
>>>>> No. What pattern do you use? Something like this?
>>>
>>>>>   if (!ev_async_pending(w))
>>>>>     ev_async_send(w);
>>>
>>>> Ben, I think this should just be the default behaviour of libuv.
>>>
>>> Agreed. Though I still would like to know if that's the actual pattern
>>> that Jorge uses. :-)
>>
>> I think you can see the relevant code at
>> https://github.com/xk/node-threads-a-gogo/blob/master/src/threads_a_gogo.cc
>
> Yes, here:
>
> https://github.com/xk/node-threads-a-gogo/blob/master/src/threads_a_gogo.cc#L202
> https://github.com/xk/node-threads-a-gogo/blob/master/src/threads_a_gogo.cc#L281
> https://github.com/xk/node-threads-a-gogo/blob/master/src/threads_a_gogo.cc#L646
> https://github.com/xk/node-sound/blob/master/src/sound.cc#L509
> https://github.com/xk/node-sound/blob/master/src/sound.cc#L1014
>
> But ev_async_pending is a macro that expands to this:
>
> if (!(+(&watcher)->sent)) ev_async_send(ev_default_loop_uc_ (), &watcher);
>
> which is not a function call, soooo.... it's not a good idea to make it "the 
> default behaviour", because if you do that the check would be made inside 
> uv_async_send() so the function call would happen always which is exactly 
> what one's trying to avoid when using ev_async_pending.

I'm not that worried about the function call overhead. The reason that
you're seeing a slowdown is that uv_async_send() is always making a
syscall now.

Reply via email to