--- libev/ev.c 2007/11/27 09:17:51 1.146 +++ libev/ev.c 2007/11/27 10:59:11 1.147 @@ -1278,6 +1278,14 @@ while (activecnt) { + /* we might have forked, so reify kernel state if necessary */ + if (expect_false (postfork)) + if (forkcnt) + { + queue_events (EV_A_ (W *)forks, forkcnt, EV_FORK); + call_pending (EV_A); + } + /* queue check watchers (and execute them) */ if (expect_false (preparecnt)) { @@ -1827,6 +1835,35 @@ ev_stop (EV_A_ (W)w); } +#endif + +#if EV_FORK_ENABLE +void +ev_fork_start (EV_P_ ev_fork *w) +{ + if (expect_false (ev_is_active (w))) + return; + + ev_start (EV_A_ (W)w, ++forkcnt); + array_needsize (ev_fork *, forks, forkmax, forkcnt, EMPTY2); + forks [forkcnt - 1] = w; +} + +void +ev_fork_stop (EV_P_ ev_fork *w) +{ + ev_clear_pending (EV_A_ (W)w); + if (expect_false (!ev_is_active (w))) + return; + + { + int active = ((W)w)->active; + forks [active - 1] = forks [--forkcnt]; + ((W)forks [active - 1])->active = active; + } + + ev_stop (EV_A_ (W)w); +} #endif /*****************************************************************************/