… | |
… | |
1184 | #include <stddef.h> |
1184 | #include <stddef.h> |
1185 | |
1185 | |
1186 | static void |
1186 | static void |
1187 | t1_cb (EV_P_ ev_timer *w, int revents) |
1187 | t1_cb (EV_P_ ev_timer *w, int revents) |
1188 | { |
1188 | { |
1189 | struct my_biggy big = (struct my_biggy * |
1189 | struct my_biggy big = (struct my_biggy *) |
1190 | (((char *)w) - offsetof (struct my_biggy, t1)); |
1190 | (((char *)w) - offsetof (struct my_biggy, t1)); |
1191 | } |
1191 | } |
1192 | |
1192 | |
1193 | static void |
1193 | static void |
1194 | t2_cb (EV_P_ ev_timer *w, int revents) |
1194 | t2_cb (EV_P_ ev_timer *w, int revents) |
1195 | { |
1195 | { |
1196 | struct my_biggy big = (struct my_biggy * |
1196 | struct my_biggy big = (struct my_biggy *) |
1197 | (((char *)w) - offsetof (struct my_biggy, t2)); |
1197 | (((char *)w) - offsetof (struct my_biggy, t2)); |
1198 | } |
1198 | } |
1199 | |
1199 | |
1200 | =head2 WATCHER PRIORITY MODELS |
1200 | =head2 WATCHER PRIORITY MODELS |
1201 | |
1201 | |
… | |
… | |
1277 | // with the default priority are receiving events. |
1277 | // with the default priority are receiving events. |
1278 | ev_idle_start (EV_A_ &idle); |
1278 | ev_idle_start (EV_A_ &idle); |
1279 | } |
1279 | } |
1280 | |
1280 | |
1281 | static void |
1281 | static void |
1282 | idle-cb (EV_P_ ev_idle *w, int revents) |
1282 | idle_cb (EV_P_ ev_idle *w, int revents) |
1283 | { |
1283 | { |
1284 | // actual processing |
1284 | // actual processing |
1285 | read (STDIN_FILENO, ...); |
1285 | read (STDIN_FILENO, ...); |
1286 | |
1286 | |
1287 | // have to start the I/O watcher again, as |
1287 | // have to start the I/O watcher again, as |
… | |
… | |
1523 | C<after> argument to C<ev_timer_set>, and only ever use the C<repeat> |
1523 | C<after> argument to C<ev_timer_set>, and only ever use the C<repeat> |
1524 | member and C<ev_timer_again>. |
1524 | member and C<ev_timer_again>. |
1525 | |
1525 | |
1526 | At start: |
1526 | At start: |
1527 | |
1527 | |
1528 | ev_timer_init (timer, callback); |
1528 | ev_init (timer, callback); |
1529 | timer->repeat = 60.; |
1529 | timer->repeat = 60.; |
1530 | ev_timer_again (loop, timer); |
1530 | ev_timer_again (loop, timer); |
1531 | |
1531 | |
1532 | Each time there is some activity: |
1532 | Each time there is some activity: |
1533 | |
1533 | |
… | |
… | |
1595 | |
1595 | |
1596 | To start the timer, simply initialise the watcher and set C<last_activity> |
1596 | To start the timer, simply initialise the watcher and set C<last_activity> |
1597 | to the current time (meaning we just have some activity :), then call the |
1597 | to the current time (meaning we just have some activity :), then call the |
1598 | callback, which will "do the right thing" and start the timer: |
1598 | callback, which will "do the right thing" and start the timer: |
1599 | |
1599 | |
1600 | ev_timer_init (timer, callback); |
1600 | ev_init (timer, callback); |
1601 | last_activity = ev_now (loop); |
1601 | last_activity = ev_now (loop); |
1602 | callback (loop, timer, EV_TIMEOUT); |
1602 | callback (loop, timer, EV_TIMEOUT); |
1603 | |
1603 | |
1604 | And when there is some activity, simply store the current time in |
1604 | And when there is some activity, simply store the current time in |
1605 | C<last_activity>, no libev calls at all: |
1605 | C<last_activity>, no libev calls at all: |
… | |
… | |
2002 | some child status changes (most typically when a child of yours dies or |
2002 | some child status changes (most typically when a child of yours dies or |
2003 | exits). It is permissible to install a child watcher I<after> the child |
2003 | exits). It is permissible to install a child watcher I<after> the child |
2004 | has been forked (which implies it might have already exited), as long |
2004 | has been forked (which implies it might have already exited), as long |
2005 | as the event loop isn't entered (or is continued from a watcher), i.e., |
2005 | as the event loop isn't entered (or is continued from a watcher), i.e., |
2006 | forking and then immediately registering a watcher for the child is fine, |
2006 | forking and then immediately registering a watcher for the child is fine, |
2007 | but forking and registering a watcher a few event loop iterations later is |
2007 | but forking and registering a watcher a few event loop iterations later or |
2008 | not. |
2008 | in the next callback invocation is not. |
2009 | |
2009 | |
2010 | Only the default event loop is capable of handling signals, and therefore |
2010 | Only the default event loop is capable of handling signals, and therefore |
2011 | you can only register child watchers in the default event loop. |
2011 | you can only register child watchers in the default event loop. |
2012 | |
2012 | |
2013 | =head3 Process Interaction |
2013 | =head3 Process Interaction |
… | |
… | |
2368 | // no longer anything immediate to do. |
2368 | // no longer anything immediate to do. |
2369 | } |
2369 | } |
2370 | |
2370 | |
2371 | ev_idle *idle_watcher = malloc (sizeof (ev_idle)); |
2371 | ev_idle *idle_watcher = malloc (sizeof (ev_idle)); |
2372 | ev_idle_init (idle_watcher, idle_cb); |
2372 | ev_idle_init (idle_watcher, idle_cb); |
2373 | ev_idle_start (loop, idle_cb); |
2373 | ev_idle_start (loop, idle_watcher); |
2374 | |
2374 | |
2375 | |
2375 | |
2376 | =head2 C<ev_prepare> and C<ev_check> - customise your event loop! |
2376 | =head2 C<ev_prepare> and C<ev_check> - customise your event loop! |
2377 | |
2377 | |
2378 | Prepare and check watchers are usually (but not always) used in pairs: |
2378 | Prepare and check watchers are usually (but not always) used in pairs: |
… | |
… | |
2471 | struct pollfd fds [nfd]; |
2471 | struct pollfd fds [nfd]; |
2472 | // actual code will need to loop here and realloc etc. |
2472 | // actual code will need to loop here and realloc etc. |
2473 | adns_beforepoll (ads, fds, &nfd, &timeout, timeval_from (ev_time ())); |
2473 | adns_beforepoll (ads, fds, &nfd, &timeout, timeval_from (ev_time ())); |
2474 | |
2474 | |
2475 | /* the callback is illegal, but won't be called as we stop during check */ |
2475 | /* the callback is illegal, but won't be called as we stop during check */ |
2476 | ev_timer_init (&tw, 0, timeout * 1e-3); |
2476 | ev_timer_init (&tw, 0, timeout * 1e-3, 0.); |
2477 | ev_timer_start (loop, &tw); |
2477 | ev_timer_start (loop, &tw); |
2478 | |
2478 | |
2479 | // create one ev_io per pollfd |
2479 | // create one ev_io per pollfd |
2480 | for (int i = 0; i < nfd; ++i) |
2480 | for (int i = 0; i < nfd; ++i) |
2481 | { |
2481 | { |