On Sun, Sep 2, 2012 at 6:54 AM, Parvez Shaikh <pshaikh.wo...@gmail.com>wrote:

> Thanks Oleg,
>
> Second approach is what I am doing.
>
> Why disabled EV_WRITE in write callback?
>
> I'd wish to have this callback called again whenever send buffer has
> space, so disabling EV_WRITE will prevent this.


You want to enable EV_WRITE only when you have something to write.

When you enable EV_WRITE, libevent will add the descriptor to the the event
backend (e.g select). When the descriptor is ready for writing, the write
callback will be called. If you always enable EV_WRITE, the callback will
be called on every loop iteration, and the event loop will never wait for
events, since the descriptor is almost always ready for writing.


>
>
> On Fri, Aug 31, 2012 at 3:54 PM, Oleg <mybrokenb...@gmail.com> wrote:
>
>> EV_WRITE calls whenever you can write to send buffer until it's not full.
>> So if you have never called send(), but EV_WRITE is enabled you will
>> receive this event each new loop (your CPU will be ~100% used).
>> If you have called send() and it didn't return EAGAIN you will also
>> receive this event next loop.
>> If you have called send() and it returned EAGAIN you will receive this
>> event when your send buffer will have some free space.
>>
>>
>> So for your sending queue it should look like this in pseudo code:
>>
>> 1) Application->Send(data)
>> {
>>         if (send() != EAGAIN )
>>                 return;
>>         else
>>         {
>>                 queue.push(data);
>>                 enable(EV_WRITE,onWriteCallback);
>>         }
>> }
>>
>> 2) onWriteCallback()
>> {
>>         while(!queue.empty)
>>         {
>>                 if (send(queue.front())== EAGAIN);
>>                         return;
>>                 queue.pop();
>>         }
>>         disable(EV_WRITE);
>> }
>>
>> 31.08.2012, в 8:50, Parvez Shaikh написал(а):
>>
>> > Hi all,
>> >
>> > I have a question about EV_WRITE event as to when does it's callback
>> function invoked?
>> >
>> > Is it that when someone first executes write on an fd associated with
>> EV_WRITE event?
>> >
>> > Or when libevent detects that application can now write to fd without
>> getting errors?
>> >
>> > For EV_READ it is easy to understand that it's callback is invoked when
>> data is available for read on fd but not clear about EV_WRITE.
>> >
>> > Here is what I am trying to do -
>> >
>> > I am trying to write asynchronous send/recv application; in which I
>> will read data on connected sockets asynchronously using "EV_READ's
>> callback.
>> >
>> > For send however, I will enqueue the data to be sent in my own
>> queue(application will write data to this buffer) and I will flush the
>> buffer in EV_WRITE callback.
>> >
>> > Now if I get the error EAGAIN in send operation in callback of
>> EV_WRITE, I will simply return  and on next invocation of EV_WRITE's
>> callback I will start flushing my buffer again.
>> >
>> > Thanks,
>> > Parvez
>>
>> ***********************************************************************
>> To unsubscribe, send an e-mail to majord...@freehaven.net with
>> unsubscribe libevent-users    in the body.
>>
>
>

Reply via email to