… | |
… | |
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 | |
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 |
… | |
… | |
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: |