mirror of /home/gitosis/repositories/libev.git
*** empty log message ***
parent
ca1555df66
commit
106b30a588
12
ev.c
12
ev.c
|
@ -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
1
ev.h
|
@ -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
17
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
|
||||
|
|
Loading…
Reference in New Issue