*** empty log message ***

master
Marc Alexander Lehmann 2009-07-14 20:31:21 +00:00
parent ca1555df66
commit 106b30a588
3 changed files with 26 additions and 4 deletions

12
ev.c
View File

@ -1842,6 +1842,18 @@ ev_invoke (EV_P_ void *w, int revents)
EV_CB_INVOKE ((W)w, revents);
}
unsigned int
ev_pending_count (EV_P)
{
int pri;
unsigned int count = 0;
for (pri = NUMPRI; pri--; )
count += pendingcnt [pri];
return count;
}
void noinline
ev_invoke_pending (EV_P)
{

1
ev.h
View File

@ -553,6 +553,7 @@ void *ev_userdata (EV_P);
void ev_set_invoke_pending_cb (EV_P_ void (*invoke_pending_cb)(EV_P));
void ev_set_loop_release_cb (EV_P_ void (*release)(EV_P), void (*acquire)(EV_P));
unsigned int ev_pending_count (EV_P); /* number of pending events, if any */
void ev_invoke_pending (EV_P); /* invoke all pending watchers */
/*

17
ev.pod
View File

@ -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