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. >> > >