Thanks Oleg and Nir. I am also pursuing another approach. Here I have defined a custom event (associated with FD but not having either EV_READ or EV_WRITE) and there is no time out either.
A thread queues data to "outgoing message list" and activates an event. In response to this, event reactor thread (one with dispatch) calls a function that sends message from this list one by one until "send" encounters EAGAIN. Requesting your feedback on this approach. Thanks On Sun, Sep 2, 2012 at 3:45 PM, Nir Soffer <nir...@gmail.com> wrote: > > > 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. >>> >> >> >