… | |
… | |
65 | } |
65 | } |
66 | |
66 | |
67 | static void |
67 | static void |
68 | readyhook (void) |
68 | readyhook (void) |
69 | { |
69 | { |
|
|
70 | if (!ev_is_active (&idler)) |
70 | ev_idle_start (EV_DEFAULT_UC, &idler); |
71 | ev_idle_start (EV_DEFAULT_UC, &idler); |
71 | } |
72 | } |
72 | |
73 | |
73 | /*****************************************************************************/ |
74 | /*****************************************************************************/ |
74 | |
75 | |
75 | typedef struct |
76 | typedef struct |
… | |
… | |
92 | coro_handle *data = (coro_handle *)mg->mg_ptr; |
93 | coro_handle *data = (coro_handle *)mg->mg_ptr; |
93 | mg->mg_ptr = 0; |
94 | mg->mg_ptr = 0; |
94 | |
95 | |
95 | ev_io_stop (EV_DEFAULT_UC, &data->r.io); ev_io_stop (EV_DEFAULT_UC, &data->w.io); |
96 | ev_io_stop (EV_DEFAULT_UC, &data->r.io); ev_io_stop (EV_DEFAULT_UC, &data->w.io); |
96 | ev_timer_stop (EV_DEFAULT_UC, &data->r.tw); ev_timer_stop (EV_DEFAULT_UC, &data->w.tw); |
97 | ev_timer_stop (EV_DEFAULT_UC, &data->r.tw); ev_timer_stop (EV_DEFAULT_UC, &data->w.tw); |
97 | SvREFCNT_dec (data->r.done); SvREFCNT_dec (data->w.done); |
98 | SvREFCNT_dec (data->r.done); SvREFCNT_dec (data->w.done); |
98 | SvREFCNT_dec (data->r.current); SvREFCNT_dec (data->w.current); |
99 | SvREFCNT_dec (data->r.current); SvREFCNT_dec (data->w.current); |
99 | |
100 | |
100 | return 0; |
101 | return 0; |
101 | } |
102 | } |
102 | |
103 | |
103 | static MGVTBL handle_vtbl = { 0, 0, 0, 0, handle_free }; |
104 | static MGVTBL handle_vtbl = { 0, 0, 0, 0, handle_free }; |
… | |
… | |
137 | BOOT: |
138 | BOOT: |
138 | { |
139 | { |
139 | I_EV_API ("Coro::EV"); |
140 | I_EV_API ("Coro::EV"); |
140 | I_CORO_API ("Coro::Event"); |
141 | I_CORO_API ("Coro::Event"); |
141 | |
142 | |
|
|
143 | EV_DEFAULT; /* make sure it is initialised */ |
|
|
144 | |
142 | ev_prepare_init (&scheduler, prepare_cb); |
145 | ev_prepare_init (&scheduler, prepare_cb); |
143 | ev_set_priority (&scheduler, EV_MINPRI); |
146 | ev_set_priority (&scheduler, EV_MINPRI); |
144 | ev_prepare_start (EV_DEFAULT, &scheduler); |
147 | ev_prepare_start (EV_DEFAULT_UC, &scheduler); |
145 | ev_unref (EV_DEFAULT); |
148 | ev_unref (EV_DEFAULT_UC); |
146 | |
149 | |
147 | ev_idle_init (&idler, idle_cb); |
150 | ev_idle_init (&idler, idle_cb); |
148 | ev_set_priority (&idler, EV_MINPRI); |
151 | ev_set_priority (&idler, EV_MINPRI); |
149 | |
152 | |
150 | CORO_READYHOOK = readyhook; |
153 | CORO_READYHOOK = readyhook; |
151 | } |
154 | } |
152 | |
155 | |
153 | void |
156 | void |
154 | _loop_oneshot () |
157 | _loop_oneshot () |
155 | CODE: |
158 | CODE: |
|
|
159 | { |
|
|
160 | /* inhibit the prepare watcher, as we know we are the only |
|
|
161 | * ready coroutine and we don't want it to start an idle watcher |
|
|
162 | * just because of the fallback idle coro being of lower priority. |
|
|
163 | */ |
156 | ++inhibit; |
164 | ++inhibit; |
|
|
165 | |
|
|
166 | /* same reasoning as above, make sure it is stopped */ |
|
|
167 | if (ev_is_active (&idler)) |
|
|
168 | ev_idle_stop (EV_DEFAULT_UC, &idler); |
|
|
169 | |
157 | ev_loop (EV_DEFAULT, EVLOOP_ONESHOT); |
170 | ev_loop (EV_DEFAULT_UC, EVLOOP_ONESHOT); |
|
|
171 | |
158 | --inhibit; |
172 | --inhibit; |
|
|
173 | } |
159 | |
174 | |
160 | void |
175 | void |
161 | _timed_io_once (...) |
176 | _timed_io_once (...) |
162 | CODE: |
177 | CODE: |
163 | { |
178 | { |
164 | ONCE_INIT; |
179 | ONCE_INIT; |
165 | assert (AvFILLp (av) >= 1); |
180 | assert (AvFILLp (av) >= 1); |
166 | ev_once ( |
181 | ev_once ( |
167 | EV_DEFAULT, |
182 | EV_DEFAULT_UC, |
168 | sv_fileno (AvARRAY (av)[0]), |
183 | sv_fileno (AvARRAY (av)[0]), |
169 | SvIV (AvARRAY (av)[1]), |
184 | SvIV (AvARRAY (av)[1]), |
170 | AvFILLp (av) >= 2 && SvOK (AvARRAY (av)[2]) ? SvNV (AvARRAY (av)[2]) : -1., |
185 | AvFILLp (av) >= 2 && SvOK (AvARRAY (av)[2]) ? SvNV (AvARRAY (av)[2]) : -1., |
171 | once_cb, |
186 | once_cb, |
172 | (void *)SvREFCNT_inc (av) |
187 | (void *)SvREFCNT_inc (av) |
… | |
… | |
179 | CODE: |
194 | CODE: |
180 | { |
195 | { |
181 | ONCE_INIT; |
196 | ONCE_INIT; |
182 | NV after = SvNV (AvARRAY (av)[0]); |
197 | NV after = SvNV (AvARRAY (av)[0]); |
183 | ev_once ( |
198 | ev_once ( |
184 | EV_DEFAULT, |
199 | EV_DEFAULT_UC, |
185 | -1, |
200 | -1, |
186 | 0, |
201 | 0, |
187 | after >= 0. ? after : 0., |
202 | after >= 0. ? after : 0., |
188 | once_cb, |
203 | once_cb, |
189 | (void *)SvREFCNT_inc (av) |
204 | (void *)SvREFCNT_inc (av) |
… | |
… | |
234 | SV *to = AvARRAY (handle)[2]; |
249 | SV *to = AvARRAY (handle)[2]; |
235 | |
250 | |
236 | if (SvOK (to)) |
251 | if (SvOK (to)) |
237 | { |
252 | { |
238 | ev_timer_set (&dir->tw, 0., SvNV (to)); |
253 | ev_timer_set (&dir->tw, 0., SvNV (to)); |
239 | ev_timer_again (EV_DEFAULT, &dir->tw); |
254 | ev_timer_again (EV_DEFAULT_UC, &dir->tw); |
240 | } |
255 | } |
241 | } |
256 | } |
242 | |
257 | |
243 | ev_io_start (EV_DEFAULT, &dir->io); |
258 | ev_io_start (EV_DEFAULT_UC, &dir->io); |
244 | } |
259 | } |
245 | |
260 | |