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