… | |
… | |
2186 | { |
2186 | { |
2187 | ev_loop (w->other, EVLOOP_NONBLOCK); |
2187 | ev_loop (w->other, EVLOOP_NONBLOCK); |
2188 | } |
2188 | } |
2189 | |
2189 | |
2190 | static void |
2190 | static void |
2191 | embed_cb (EV_P_ ev_io *io, int revents) |
2191 | embed_io_cb (EV_P_ ev_io *io, int revents) |
2192 | { |
2192 | { |
2193 | ev_embed *w = (ev_embed *)(((char *)io) - offsetof (ev_embed, io)); |
2193 | ev_embed *w = (ev_embed *)(((char *)io) - offsetof (ev_embed, io)); |
2194 | |
2194 | |
2195 | if (ev_cb (w)) |
2195 | if (ev_cb (w)) |
2196 | ev_feed_event (EV_A_ (W)w, EV_EMBED); |
2196 | ev_feed_event (EV_A_ (W)w, EV_EMBED); |
2197 | else |
2197 | else |
2198 | ev_embed_sweep (loop, w); |
2198 | ev_embed_sweep (loop, w); |
2199 | } |
2199 | } |
2200 | |
2200 | |
|
|
2201 | static void |
|
|
2202 | embed_prepare_cb (EV_P_ ev_prepare *prepare, int revents) |
|
|
2203 | { |
|
|
2204 | ev_embed *w = (ev_embed *)(((char *)prepare) - offsetof (ev_embed, prepare)); |
|
|
2205 | |
|
|
2206 | fd_reify (w->other); |
|
|
2207 | } |
|
|
2208 | |
2201 | void |
2209 | void |
2202 | ev_embed_start (EV_P_ ev_embed *w) |
2210 | ev_embed_start (EV_P_ ev_embed *w) |
2203 | { |
2211 | { |
2204 | if (expect_false (ev_is_active (w))) |
2212 | if (expect_false (ev_is_active (w))) |
2205 | return; |
2213 | return; |
2206 | |
2214 | |
2207 | { |
2215 | { |
2208 | struct ev_loop *loop = w->other; |
2216 | struct ev_loop *loop = w->other; |
2209 | assert (("loop to be embedded is not embeddable", backend & ev_embeddable_backends ())); |
2217 | assert (("loop to be embedded is not embeddable", backend & ev_embeddable_backends ())); |
2210 | ev_io_init (&w->io, embed_cb, backend_fd, EV_READ); |
2218 | ev_io_init (&w->io, embed_io_cb, backend_fd, EV_READ); |
2211 | } |
2219 | } |
2212 | |
2220 | |
2213 | ev_set_priority (&w->io, ev_priority (w)); |
2221 | ev_set_priority (&w->io, ev_priority (w)); |
2214 | ev_io_start (EV_A_ &w->io); |
2222 | ev_io_start (EV_A_ &w->io); |
2215 | |
2223 | |
|
|
2224 | ev_prepare_init (&w->prepare, embed_prepare_cb); |
|
|
2225 | ev_set_priority (&w->prepare, EV_MINPRI); |
|
|
2226 | ev_prepare_start (EV_A_ &w->prepare); |
|
|
2227 | |
2216 | ev_start (EV_A_ (W)w, 1); |
2228 | ev_start (EV_A_ (W)w, 1); |
2217 | } |
2229 | } |
2218 | |
2230 | |
2219 | void |
2231 | void |
2220 | ev_embed_stop (EV_P_ ev_embed *w) |
2232 | ev_embed_stop (EV_P_ ev_embed *w) |
… | |
… | |
2222 | clear_pending (EV_A_ (W)w); |
2234 | clear_pending (EV_A_ (W)w); |
2223 | if (expect_false (!ev_is_active (w))) |
2235 | if (expect_false (!ev_is_active (w))) |
2224 | return; |
2236 | return; |
2225 | |
2237 | |
2226 | ev_io_stop (EV_A_ &w->io); |
2238 | ev_io_stop (EV_A_ &w->io); |
|
|
2239 | ev_prepare_stop (EV_A_ &w->prepare); |
2227 | |
2240 | |
2228 | ev_stop (EV_A_ (W)w); |
2241 | ev_stop (EV_A_ (W)w); |
2229 | } |
2242 | } |
2230 | #endif |
2243 | #endif |
2231 | |
2244 | |