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

Comparing libev/ev.pod (file contents):
Revision 1.462 by root, Wed Jan 22 13:06:53 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
1653 1653
1654Most members are additionally marked with either I<[read-only]>, meaning 1654Most members are additionally marked with either I<[read-only]>, meaning
1655that, while the watcher is active, you can look at the member and expect 1655that, while the watcher is active, you can look at the member and expect
1656some sensible content, but you must not modify it (you can modify it while 1656some sensible content, but you must not modify it (you can modify it while
1657the watcher is stopped to your hearts content), or I<[read-write]>, which 1657the watcher is stopped to your hearts content), or I<[read-write]>, which
1658means you can expect it to have some sensible content while the watcher 1658means you can expect it to have some sensible content while the watcher is
1659is active, but you can also modify it. Modifying it may not do something 1659active, but you can also modify it (within the same thread as the event
1660loop, i.e. without creating data races). Modifying it may not do something
1660sensible or take immediate effect (or do anything at all), but libev will 1661sensible or take immediate effect (or do anything at all), but libev will
1661not crash or malfunction in any way. 1662not crash or malfunction in any way.
1662 1663
1663In any case, the documentation for each member will explain what the 1664In any case, the documentation for each member will explain what the
1664effects are, and if there are any additional access restrictions. 1665effects are, and if there are any additional access restrictions.
1840to 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
1841starting an io watcher watching for no events you should do so. 1842starting an io watcher watching for no events you should do so.
1842 1843
1843=item ev_io_modify (ev_io *, int events) 1844=item ev_io_modify (ev_io *, int events)
1844 1845
1845Similar 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
1846be 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>
1847refers to the same underlying file description, something it cannot do 1848still refers to the same underlying file description, something it cannot
1848when using C<ev_io_set>. 1849do when using C<ev_io_set>.
1849 1850
1850=item int fd [no-modify] 1851=item int fd [no-modify]
1851 1852
1852The 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
1853must 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
3861event 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.
3862 3863
3863First, you need to associate some data with the event loop: 3864First, you need to associate some data with the event loop:
3864 3865
3865 typedef struct { 3866 typedef struct {
3866 mutex_t lock; /* global loop lock */ 3867 pthread_mutex_t lock; /* global loop lock */
3868 pthread_t tid;
3869 pthread_cond_t invoke_cv;
3867 ev_async async_w; 3870 ev_async async_w;
3868 thread_t tid;
3869 cond_t invoke_cv;
3870 } userdata; 3871 } userdata;
3871 3872
3872 void prepare_loop (EV_P) 3873 void prepare_loop (EV_P)
3873 { 3874 {
3874 // for simplicity, we use a static userdata struct. 3875 // for simplicity, we use a static userdata struct.
3875 static userdata u; 3876 static userdata u;
3876 3877
3877 ev_async_init (&u->async_w, async_cb); 3878 ev_async_init (&u.async_w, async_cb);
3878 ev_async_start (EV_A_ &u->async_w); 3879 ev_async_start (EV_A_ &u.async_w);
3879 3880
3880 pthread_mutex_init (&u->lock, 0); 3881 pthread_mutex_init (&u.lock, 0);
3881 pthread_cond_init (&u->invoke_cv, 0); 3882 pthread_cond_init (&u.invoke_cv, 0);
3882 3883
3883 // now associate this with the loop 3884 // now associate this with the loop
3884 ev_set_userdata (EV_A_ u); 3885 ev_set_userdata (EV_A_ &u);
3885 ev_set_invoke_pending_cb (EV_A_ l_invoke); 3886 ev_set_invoke_pending_cb (EV_A_ l_invoke);
3886 ev_set_loop_release_cb (EV_A_ l_release, l_acquire); 3887 ev_set_loop_release_cb (EV_A_ l_release, l_acquire);
3887 3888
3888 // then create the thread running ev_run 3889 // then create the thread running ev_run
3889 pthread_create (&u->tid, 0, l_run, EV_A); 3890 pthread_create (&u.tid, 0, l_run, EV_A);
3890 } 3891 }
3891 3892
3892The 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
3893solely 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
3894that might have been added: 3895that might have been added:

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines