diff -u ../libev-cvs/ev.c libev/ev.c
--- ../libev-cvs/ev.c	2012-05-29 02:03:13.248051541 +0400
+++ libev/ev.c	2012-05-29 16:34:56.129473469 +0400
@@ -2037,6 +2037,7 @@
 static WL childs [EV_PID_HASHSIZE];
 
 static ev_signal childev;
+static ev_timer childpollev;
 
 #ifndef WIFCONTINUED
 # define WIFCONTINUED(status) 0
@@ -2362,6 +2363,11 @@
       ev_ref (EV_A); /* child watcher */
       ev_signal_stop (EV_A_ &childev);
     }
+  if (ev_is_default_loop (EV_A) && ev_is_active (&childpollev))
+    {
+      ev_ref (EV_A); /* child watcher */
+      ev_timer_stop (EV_A_ &childpollev);
+    }
 #endif
 
   if (ev_is_active (&pipe_w))
@@ -2668,6 +2674,8 @@
           ev_set_priority (&childev, EV_MAXPRI);
           ev_signal_start (EV_A_ &childev);
           ev_unref (EV_A); /* child watcher should not keep loop alive */
+          ev_timer_init (&childpollev, childcb, 1.0, 1.0);
+          ev_set_priority (&childpollev, EV_MAXPRI);
 #endif
         }
       else
@@ -3589,9 +3597,17 @@
 
   EV_FREQUENT_CHECK;
 
+  ++childall;
+
   ev_start (EV_A_ (W)w, 1);
   wlist_add (&childs [w->pid & ((EV_PID_HASHSIZE) - 1)], (WL)w);
 
+  if (!ev_is_active (&childpollev))
+    {
+      ev_timer_start (EV_A_ &childpollev);
+      ev_unref (EV_A);
+    }
+
   EV_FREQUENT_CHECK;
 }
 
@@ -3607,6 +3623,12 @@
   wlist_del (&childs [w->pid & ((EV_PID_HASHSIZE) - 1)], (WL)w);
   ev_stop (EV_A_ (W)w);
 
+  if (--childall <= 0 && ev_is_active (&childpollev))
+    {
+      ev_timer_stop (EV_A_ &childpollev);
+      ev_ref (EV_A);
+    }
+
   EV_FREQUENT_CHECK;
 }
 
diff -u ../libev-cvs/ev_vars.h libev/ev_vars.h
--- ../libev-cvs/ev_vars.h	2012-05-19 16:59:26.417960414 +0400
+++ libev/ev_vars.h	2012-05-29 16:34:29.317342393 +0400
@@ -176,6 +176,10 @@
 VARx(int, asynccnt)
 #endif
 
+#if EV_CHILD_ENABLE || EV_GENWRAP
+VARx(int, childall) /* total number */
+#endif
+
 #if EV_USE_INOTIFY || EV_GENWRAP
 VARx(int, fs_fd)
 VARx(ev_io, fs_w)
diff -u ../libev-cvs/ev_wrap.h libev/ev_wrap.h
--- ../libev-cvs/ev_wrap.h	2012-05-19 16:59:26.693961760 +0400
+++ libev/ev_wrap.h	2012-05-29 16:34:29.317342393 +0400
@@ -17,6 +17,7 @@
 #define checkcnt ((loop)->checkcnt)
 #define checkmax ((loop)->checkmax)
 #define checks ((loop)->checks)
+#define childall ((loop)->childall)
 #define cleanupcnt ((loop)->cleanupcnt)
 #define cleanupmax ((loop)->cleanupmax)
 #define cleanups ((loop)->cleanups)
@@ -117,6 +118,7 @@
 #undef checkcnt
 #undef checkmax
 #undef checks
+#undef childall
 #undef cleanupcnt
 #undef cleanupmax
 #undef cleanups
