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

Comparing libev/ev.pod (file contents):
Revision 1.463 by root, Wed Jan 22 14:09:07 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.
1396 1396
1397=item bool ev_is_active (ev_TYPE *watcher) 1397=item bool ev_is_active (ev_TYPE *watcher)
1398 1398
1399Returns a true value iff the watcher is active (i.e. it has been started 1399Returns a true value iff the watcher is active (i.e. it has been started
1400and not yet been stopped). As long as a watcher is active you must not modify 1400and not yet been stopped). As long as a watcher is active you must not modify
1401it. 1401it unless documented otherwise.
1402 1402
1403=item bool ev_is_pending (ev_TYPE *watcher) 1403=item bool ev_is_pending (ev_TYPE *watcher)
1404 1404
1405Returns a true value iff the watcher is pending, (i.e. it has outstanding 1405Returns a true value iff the watcher is pending, (i.e. it has outstanding
1406events but its callback has not yet been invoked). As long as a watcher 1406events but its callback has not yet been invoked). As long as a watcher
1841to generate this combination this is fine, but if it is easy to avoid 1841to generate this combination this is fine, but if it is easy to avoid
1842starting an io watcher watching for no events you should do so. 1842starting an io watcher watching for no events you should do so.
1843 1843
1844=item ev_io_modify (ev_io *, int events) 1844=item ev_io_modify (ev_io *, int events)
1845 1845
1846Similar to C<ev_io_set>, but only changes the event mask. Using this might 1846Similar to C<ev_io_set>, but only changes the requested events. Using this
1847be faster with some backends, as libev can assume that the C<fd> still 1847might be faster with some backends, as libev can assume that the C<fd>
1848refers to the same underlying file description, something it cannot do 1848still refers to the same underlying file description, something it cannot
1849when using C<ev_io_set>. 1849do when using C<ev_io_set>.
1850 1850
1851=item int fd [no-modify] 1851=item int fd [no-modify]
1852 1852
1853The file descriptor being watched. While it can be read at any time, you 1853The file descriptor being watched. While it can be read at any time, you
1854must not modify this member even when the watcher is stopped - always use 1854must not modify this member even when the watcher is stopped - always use
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