diff options
Diffstat (limited to 'ev.pod')
-rw-r--r-- | ev.pod | 17 |
1 files changed, 13 insertions, 4 deletions
@@ -864,6 +864,11 @@ This call will simply invoke all pending watchers while resetting their pending state. Normally, C<ev_loop> does this automatically when required, but when overriding the invoke callback this call comes handy. +=item int ev_pending_count (loop) + +Returns the number of pending watchers - zero indicates that no watchers +are pending. + =item ev_set_invoke_pending_cb (loop, void (*invoke_pending_cb)(EV_P)) This overrides the invoke pending functionality of the loop: Instead of @@ -4030,16 +4035,20 @@ into C<ev_loop>: Instead of invoking all pending watchers, the C<l_invoke> callback will signal the main thread via some unspecified mechanism (signals? pipe writes? C<Async::Interrupt>?) and then waits until all pending watchers -have been called: +have been called (in a while loop because a) spurious wakeups are possible +and b) skipping inter-thread-communication when there are no pending +watchers is very beneficial): static void l_invoke (EV_P) { userdata *u = ev_userdata (EV_A); - wake_up_other_thread_in_some_magic_or_not_so_magic_way (); - - pthread_cond_wait (&u->invoke_cv, &u->lock); + while (ev_pending_count (EV_A)) + { + wake_up_other_thread_in_some_magic_or_not_so_magic_way (); + pthread_cond_wait (&u->invoke_cv, &u->lock); + } } Now, whenever the main thread gets told to invoke pending watchers, it |