Hi,
On Mon, Jun 25, 2012 at 12:52:35AM +0200, Marek Denis <marek at
octogan.net> wrote:
different threads is a safe technique. However I am not really sure,
whrther those calls will trigger callback functions the exact number
of
They don't. It works like any other watcher, such as timers or I/O
watchers, it's only invoked as soon as possible.
however I would like to be able to make a callback like:
The extra emptyness test of your queue ought to be way cheaper than
the
atomic counter libev would have to implement.
OK, I think some explanation would be quite useful for me.
What actually happens if something like this happens:
A callback function A_cb() is called upon triggering the async watcher.
The A_cb() locks a mutex and takes some "command package" from the
shared queue. The commands are added by other threads, so the access
needs to be synchronized. Now, A_cb() takes the command and calls
another function B_notify() that adds some pointers to objects B waiting
for work done in a thread. Also, B_notify() triggers B's async watcher
telling him "go ahead, here is new data for you".
So, here is the situation, where calling one callback function (A_cb)
will end up in triggering another watcher (and thus call another
callback).
Now, if I make a code like:
Here is that A_cb():
mutex.lock()
while(!queue.empty()) {
data = get_data_from_hared_queue();
flow->B_notify(data);
}
mutex.unlock();
and B_notify(data) will look like:
appropriate_queue = choose_queue_from_object();
appropriate_queue.add(data);
this->async_watcher.send(); (let's imagine it runs iterate_cb()
function)
Now my question is if the flow->B_notify() will end only after the
iterate_cb() function returns (so the iterate_cb will be running with
mutex still locked!)? Or rather flow->B_notify() is called, inside the
B_notify the watcher is triggered (but the callback doesn't launch),
B_notify() returns,the mutex is unlocked and only after that libev runs
iterate_cb as a this->async_watcher callback ?
--
Marek Denis
[[email protected]]
_______________________________________________
libev mailing list
[email protected]
http://lists.schmorp.de/cgi-bin/mailman/listinfo/libev