… | |
… | |
142 | } |
142 | } |
143 | |
143 | |
144 | static void |
144 | static void |
145 | x_cb_sig (EV_P_ struct ev_signal *w, int revents) |
145 | x_cb_sig (EV_P_ struct ev_signal *w, int revents) |
146 | { |
146 | { |
147 | x_cb ((struct event *)(((char *)w) - offsetof (struct event, iosig.sig)), revents); |
147 | struct event *ev = (struct event *)(((char *)w) - offsetof (struct event, iosig.sig)); |
|
|
148 | |
|
|
149 | if (revents & EV_ERROR) |
|
|
150 | event_del (ev); |
|
|
151 | |
|
|
152 | x_cb (ev, revents); |
148 | } |
153 | } |
149 | |
154 | |
150 | static void |
155 | static void |
151 | x_cb_io (EV_P_ struct ev_io *w, int revents) |
156 | x_cb_io (EV_P_ struct ev_io *w, int revents) |
152 | { |
157 | { |
153 | struct event *ev = (struct event *)(((char *)w) - offsetof (struct event, iosig.io)); |
158 | struct event *ev = (struct event *)(((char *)w) - offsetof (struct event, iosig.io)); |
154 | |
159 | |
|
|
160 | if (revents & EV_ERROR) |
|
|
161 | event_del (ev); |
155 | if (!(ev->ev_events & EV_PERSIST) && ev_is_active (w)) |
162 | else if (!(ev->ev_events & EV_PERSIST) && ev_is_active (w)) |
156 | ev_io_stop (EV_A_ w); |
163 | ev_io_stop (EV_A_ w); |
157 | |
164 | |
158 | x_cb (ev, revents); |
165 | x_cb (ev, revents); |
159 | } |
166 | } |
160 | |
167 | |
… | |
… | |
239 | ev_timer_stop (EV_A_ &ev->to); |
246 | ev_timer_stop (EV_A_ &ev->to); |
240 | |
247 | |
241 | return 0; |
248 | return 0; |
242 | } |
249 | } |
243 | |
250 | |
|
|
251 | void event_active (struct event *ev, int res, short ncalls) |
|
|
252 | { |
|
|
253 | dLOOPev; |
|
|
254 | |
|
|
255 | if (res & EV_TIMEOUT) |
|
|
256 | ev_feed_event (EV_A_ &ev->to, res & EV_TIMEOUT); |
|
|
257 | |
|
|
258 | if (res & EV_SIGNAL) |
|
|
259 | ev_feed_event (EV_A_ &ev->iosig.sig, res & EV_SIGNAL); |
|
|
260 | |
|
|
261 | if (res & (EV_READ | EV_WRITE)) |
|
|
262 | ev_feed_event (EV_A_ &ev->iosig.io, res & (EV_READ | EV_WRITE)); |
|
|
263 | } |
|
|
264 | |
244 | int event_pending (struct event *ev, short events, struct timeval *tv) |
265 | int event_pending (struct event *ev, short events, struct timeval *tv) |
245 | { |
266 | { |
246 | short revents = 0; |
267 | short revents = 0; |
247 | dLOOPev; |
268 | dLOOPev; |
248 | |
269 | |
… | |
… | |
330 | }; |
351 | }; |
331 | |
352 | |
332 | static void |
353 | static void |
333 | x_once_cb (int revents, void *arg) |
354 | x_once_cb (int revents, void *arg) |
334 | { |
355 | { |
335 | struct x_once *once = arg; |
356 | struct x_once *once = (struct x_once *)arg; |
336 | |
357 | |
337 | once->cb (once->fd, revents, once->arg); |
358 | once->cb (once->fd, revents, once->arg); |
338 | free (once); |
359 | free (once); |
339 | } |
360 | } |
340 | |
361 | |
341 | int event_base_once (struct event_base *base, int fd, short events, void (*cb)(int, short, void *), void *arg, struct timeval *tv) |
362 | int event_base_once (struct event_base *base, int fd, short events, void (*cb)(int, short, void *), void *arg, struct timeval *tv) |
342 | { |
363 | { |
343 | struct x_once *once = malloc (sizeof (struct x_once)); |
364 | struct x_once *once = (struct x_once *)malloc (sizeof (struct x_once)); |
344 | dLOOPbase; |
365 | dLOOPbase; |
345 | |
366 | |
346 | if (!once) |
367 | if (!once) |
347 | return -1; |
368 | return -1; |
348 | |
369 | |