ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/libev/ev.pod
(Generate patch)

Comparing libev/ev.pod (file contents):
Revision 1.465 by root, Sun Mar 22 15:13:17 2020 UTC vs.
Revision 1.467 by root, Sun Sep 13 22:17:02 2020 UTC

959 - Queue all expired timers. 959 - Queue all expired timers.
960 - Queue all expired periodics. 960 - Queue all expired periodics.
961 - Queue all idle watchers with priority higher than that of pending events. 961 - Queue all idle watchers with priority higher than that of pending events.
962 - Queue all check watchers. 962 - Queue all check watchers.
963 - Call all queued watchers in reverse order (i.e. check watchers first). 963 - Call all queued watchers in reverse order (i.e. check watchers first).
964 Signals and child watchers are implemented as I/O watchers, and will 964 Signals, async and child watchers are implemented as I/O watchers, and
965 be handled here by queueing them when their watcher gets executed. 965 will be handled here by queueing them when their watcher gets executed.
966 - If ev_break has been called, or EVRUN_ONCE or EVRUN_NOWAIT 966 - If ev_break has been called, or EVRUN_ONCE or EVRUN_NOWAIT
967 were used, or there are no active watchers, goto FINISH, otherwise 967 were used, or there are no active watchers, goto FINISH, otherwise
968 continue with step LOOP. 968 continue with step LOOP.
969 FINISH: 969 FINISH:
970 - Reset the ev_break status iff it was EVBREAK_ONE. 970 - Reset the ev_break status iff it was EVBREAK_ONE.
3862event loop thread and an unspecified mechanism to wake up the main thread. 3862event loop thread and an unspecified mechanism to wake up the main thread.
3863 3863
3864First, you need to associate some data with the event loop: 3864First, you need to associate some data with the event loop:
3865 3865
3866 typedef struct { 3866 typedef struct {
3867 mutex_t lock; /* global loop lock */ 3867 pthread_mutex_t lock; /* global loop lock */
3868 pthread_t tid;
3869 pthread_cond_t invoke_cv;
3868 ev_async async_w; 3870 ev_async async_w;
3869 thread_t tid;
3870 cond_t invoke_cv;
3871 } userdata; 3871 } userdata;
3872 3872
3873 void prepare_loop (EV_P) 3873 void prepare_loop (EV_P)
3874 { 3874 {
3875 // for simplicity, we use a static userdata struct. 3875 // for simplicity, we use a static userdata struct.
3876 static userdata u; 3876 static userdata u;
3877 3877
3878 ev_async_init (&u->async_w, async_cb); 3878 ev_async_init (&u.async_w, async_cb);
3879 ev_async_start (EV_A_ &u->async_w); 3879 ev_async_start (EV_A_ &u.async_w);
3880 3880
3881 pthread_mutex_init (&u->lock, 0); 3881 pthread_mutex_init (&u.lock, 0);
3882 pthread_cond_init (&u->invoke_cv, 0); 3882 pthread_cond_init (&u.invoke_cv, 0);
3883 3883
3884 // now associate this with the loop 3884 // now associate this with the loop
3885 ev_set_userdata (EV_A_ u); 3885 ev_set_userdata (EV_A_ &u);
3886 ev_set_invoke_pending_cb (EV_A_ l_invoke); 3886 ev_set_invoke_pending_cb (EV_A_ l_invoke);
3887 ev_set_loop_release_cb (EV_A_ l_release, l_acquire); 3887 ev_set_loop_release_cb (EV_A_ l_release, l_acquire);
3888 3888
3889 // then create the thread running ev_run 3889 // then create the thread running ev_run
3890 pthread_create (&u->tid, 0, l_run, EV_A); 3890 pthread_create (&u.tid, 0, l_run, EV_A);
3891 } 3891 }
3892 3892
3893The callback for the C<ev_async> watcher does nothing: the watcher is used 3893The callback for the C<ev_async> watcher does nothing: the watcher is used
3894solely to wake up the event loop so it takes notice of any new watchers 3894solely to wake up the event loop so it takes notice of any new watchers
3895that might have been added: 3895that might have been added:

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines