summaryrefslogtreecommitdiff
path: root/ev.pod
diff options
context:
space:
mode:
authorroot <root>2009-07-14 20:31:21 +0000
committerroot <root>2009-07-14 20:31:21 +0000
commit5fda87c6986d7a734b73b21afac13eb80242012b (patch)
treec51143c71e1d3642dc92dd4d255e3f577fbd288d /ev.pod
parent7564459ef21327361ff12bb9e2c793cb755b45cb (diff)
*** empty log message ***
Diffstat (limited to 'ev.pod')
-rw-r--r--ev.pod17
1 files changed, 13 insertions, 4 deletions
diff --git a/ev.pod b/ev.pod
index 0e32388..ec747e8 100644
--- a/ev.pod
+++ b/ev.pod
@@ -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