… | |
… | |
862 | |
862 | |
863 | This call will simply invoke all pending watchers while resetting their |
863 | This call will simply invoke all pending watchers while resetting their |
864 | pending state. Normally, C<ev_loop> does this automatically when required, |
864 | pending state. Normally, C<ev_loop> does this automatically when required, |
865 | but when overriding the invoke callback this call comes handy. |
865 | but when overriding the invoke callback this call comes handy. |
866 | |
866 | |
|
|
867 | =item int ev_pending_count (loop) |
|
|
868 | |
|
|
869 | Returns the number of pending watchers - zero indicates that no watchers |
|
|
870 | are pending. |
|
|
871 | |
867 | =item ev_set_invoke_pending_cb (loop, void (*invoke_pending_cb)(EV_P)) |
872 | =item ev_set_invoke_pending_cb (loop, void (*invoke_pending_cb)(EV_P)) |
868 | |
873 | |
869 | This overrides the invoke pending functionality of the loop: Instead of |
874 | This overrides the invoke pending functionality of the loop: Instead of |
870 | invoking all pending watchers when there are any, C<ev_loop> will call |
875 | invoking all pending watchers when there are any, C<ev_loop> will call |
871 | this callback instead. This is useful, for example, when you want to |
876 | this callback instead. This is useful, for example, when you want to |
… | |
… | |
4028 | } |
4033 | } |
4029 | |
4034 | |
4030 | Instead of invoking all pending watchers, the C<l_invoke> callback will |
4035 | Instead of invoking all pending watchers, the C<l_invoke> callback will |
4031 | signal the main thread via some unspecified mechanism (signals? pipe |
4036 | signal the main thread via some unspecified mechanism (signals? pipe |
4032 | writes? C<Async::Interrupt>?) and then waits until all pending watchers |
4037 | writes? C<Async::Interrupt>?) and then waits until all pending watchers |
4033 | have been called: |
4038 | have been called (in a while loop because a) spurious wakeups are possible |
|
|
4039 | and b) skipping inter-thread-communication when there are no pending |
|
|
4040 | watchers is very beneficial): |
4034 | |
4041 | |
4035 | static void |
4042 | static void |
4036 | l_invoke (EV_P) |
4043 | l_invoke (EV_P) |
4037 | { |
4044 | { |
4038 | userdata *u = ev_userdata (EV_A); |
4045 | userdata *u = ev_userdata (EV_A); |
4039 | |
4046 | |
|
|
4047 | while (ev_pending_count (EV_A)) |
|
|
4048 | { |
4040 | wake_up_other_thread_in_some_magic_or_not_so_magic_way (); |
4049 | wake_up_other_thread_in_some_magic_or_not_so_magic_way (); |
4041 | |
|
|
4042 | pthread_cond_wait (&u->invoke_cv, &u->lock); |
4050 | pthread_cond_wait (&u->invoke_cv, &u->lock); |
|
|
4051 | } |
4043 | } |
4052 | } |
4044 | |
4053 | |
4045 | Now, whenever the main thread gets told to invoke pending watchers, it |
4054 | Now, whenever the main thread gets told to invoke pending watchers, it |
4046 | will grab the lock, call C<ev_invoke_pending> and then signal the loop |
4055 | will grab the lock, call C<ev_invoke_pending> and then signal the loop |
4047 | thread to continue: |
4056 | thread to continue: |