The following code skeleton shows how I would do it.
worker_thread_function(...)
{
while( !done )
{
// waiting to call ev_loop
waiting_thread_count++;
while( ev_loop_in_progress )
wait_notification(); // done with a condition variable
waiting_thread_count--;
// call the ev_loop
if( !done )
{
ev_loop_in_progress = true;
ev_loop( ONE_SHOT );
ev_loop_in_progress = false;
}
notify();
// process pending requests
while( has_pending_requests() && waiting_thread_count > 0 )
process_request();
}
}
One of the callbacks would eventually set the done flag to false. The
callback handling incoming data event would collect data until a
complete request is obtained and then queues it for processing. This
would do the job nicely, though the overhead of the repeated call of
ev_loop is unknown.
There must be at least two worker threads otherwise it will simply queue request. This is because it is designed to have always one worker thread executing the ev_loop.
The code can be adapted to automatically increase the number of threads (remember to add an upper limit !) if there is a pending request and no waiting thread. A worker thread would then stop if it executed ev_loop beyond a time limit without processing any requests, unless the waiting thread count is less than 2.
-- Ch. Meessen
smime.p7s
Description: S/MIME Cryptographic Signature
_______________________________________________ libev mailing list [email protected] http://lists.schmorp.de/cgi-bin/mailman/listinfo/libev
