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.

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