rick at tropicalstormsoftware.com
Thu Feb 26 11:26:30 CET 2009
I am evaluating implementing a leader/follower pattern for multiplexing threads over a
single libev event_loop, ala ACE_Reactor. I have decided against using the defualt_event_loop
for the thread pool as it is too concerned with signals etc...
My plan is to protect a shared event_loop with a mutex of some kind so that only the leader
blocks waiting. When events are signalled, the handlers record the filehandle that is ready
in some way, then release the mutex, this allows the next waiting thread to enter the loop,
and the current thread then processes the set of ready filehandles. In order to get the
performance benefit of the leader/follower pattern, the leader must remove the signalled handles
from the event loop prior to releasing the mutex, and then inform the currently blocking thread
at a later time when processing has completed, so that the removed filehandles can be reinserted.
This raises a question: What is the most efficient way to 'disable' and 're-enable' event watchers?
Do I simply add and remove them each time they are signalled, or will this cause lots of heap churn?
Is there a simple 'disable' ev_XXX_set() I can call (I can't see one... but I am not sure what the
active flag is designed for).
Also, is there a convenient/efficient way to iterate over the complete set of watchers (active) or
will I have to implement some kind of index to enable a posted ev_async call to reenable the watchers?
Again, does anyone have any recommendations over how to construct the main blocking loop: Do I either
use prepare/check watchers around a repeating loop, or an outer for(;;) containing a loop_once() ?
Any comments or ideas greatfully received!
More information about the libev