… | |
… | |
1396 | |
1396 | |
1397 | =item bool ev_is_active (ev_TYPE *watcher) |
1397 | =item bool ev_is_active (ev_TYPE *watcher) |
1398 | |
1398 | |
1399 | Returns a true value iff the watcher is active (i.e. it has been started |
1399 | Returns a true value iff the watcher is active (i.e. it has been started |
1400 | and not yet been stopped). As long as a watcher is active you must not modify |
1400 | and not yet been stopped). As long as a watcher is active you must not modify |
1401 | it. |
1401 | it 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 | |
1405 | Returns a true value iff the watcher is pending, (i.e. it has outstanding |
1405 | Returns a true value iff the watcher is pending, (i.e. it has outstanding |
1406 | events but its callback has not yet been invoked). As long as a watcher |
1406 | events but its callback has not yet been invoked). As long as a watcher |
… | |
… | |
1841 | to generate this combination this is fine, but if it is easy to avoid |
1841 | to generate this combination this is fine, but if it is easy to avoid |
1842 | starting an io watcher watching for no events you should do so. |
1842 | starting 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 | |
1846 | Similar to C<ev_io_set>, but only changes the event mask. Using this might |
1846 | Similar to C<ev_io_set>, but only changes the requested events. Using this |
1847 | be faster with some backends, as libev can assume that the C<fd> still |
1847 | might be faster with some backends, as libev can assume that the C<fd> |
1848 | refers to the same underlying file description, something it cannot do |
1848 | still refers to the same underlying file description, something it cannot |
1849 | when using C<ev_io_set>. |
1849 | do when using C<ev_io_set>. |
1850 | |
1850 | |
1851 | =item int fd [no-modify] |
1851 | =item int fd [no-modify] |
1852 | |
1852 | |
1853 | The file descriptor being watched. While it can be read at any time, you |
1853 | The file descriptor being watched. While it can be read at any time, you |
1854 | must not modify this member even when the watcher is stopped - always use |
1854 | must not modify this member even when the watcher is stopped - always use |
… | |
… | |
3862 | event loop thread and an unspecified mechanism to wake up the main thread. |
3862 | event loop thread and an unspecified mechanism to wake up the main thread. |
3863 | |
3863 | |
3864 | First, you need to associate some data with the event loop: |
3864 | First, 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 | |
3893 | The callback for the C<ev_async> watcher does nothing: the watcher is used |
3893 | The callback for the C<ev_async> watcher does nothing: the watcher is used |
3894 | solely to wake up the event loop so it takes notice of any new watchers |
3894 | solely to wake up the event loop so it takes notice of any new watchers |
3895 | that might have been added: |
3895 | that might have been added: |