]> git.llucax.com Git - software/libev.git/blobdiff - ev.c
applied fix by chris brody
[software/libev.git] / ev.c
diff --git a/ev.c b/ev.c
index 1f2429cb184b9684f510a6e7fa59efefd0696cd7..8cb61413c15c2cc048cb97d74f13f7f14adc017b 100644 (file)
--- a/ev.c
+++ b/ev.c
@@ -888,6 +888,12 @@ ev_backend (EV_P)
   return backend;
 }
 
+unsigned int
+ev_loop_count (EV_P)
+{
+  return loop_count;
+}
+
 static void noinline
 loop_init (EV_P_ unsigned int flags)
 {
@@ -906,6 +912,12 @@ loop_init (EV_P_ unsigned int flags)
       now_floor = mn_now;
       rtmn_diff = ev_rt_now - mn_now;
 
+      /* pid check not overridable via env */
+#ifndef _WIN32
+      if (flags & EVFLAG_FORKCHECK)
+        curpid = getpid ();
+#endif
+
       if (!(flags & EVFLAG_NOENV)
           && !enable_secure ()
           && getenv ("LIBEV_FLAGS"))
@@ -1336,8 +1348,19 @@ ev_loop (EV_P_ int flags)
             ? EVUNLOOP_ONE
             : EVUNLOOP_CANCEL;
 
-  while (activecnt)
+  call_pending (EV_A); /* in case we recurse, ensure ordering stays nice and clean */
+
+  do
     {
+#ifndef _WIN32
+      if (expect_false (curpid)) /* penalise the forking check even more */
+        if (expect_false (getpid () != curpid))
+          {
+            curpid = getpid ();
+            postfork = 1;
+          }
+#endif
+
 #if EV_FORK_ENABLE
       /* we might have forked, so queue fork handlers */
       if (expect_false (postfork))
@@ -1355,6 +1378,9 @@ ev_loop (EV_P_ int flags)
           call_pending (EV_A);
         }
 
+      if (expect_false (!activecnt))
+        break;
+
       /* we might have forked, so reify kernel state if necessary */
       if (expect_false (postfork))
         loop_fork (EV_A);
@@ -1366,7 +1392,7 @@ ev_loop (EV_P_ int flags)
       {
         ev_tstamp block;
 
-        if (flags & EVLOOP_NONBLOCK || idlecnt)
+        if (expect_false (flags & EVLOOP_NONBLOCK || idlecnt || !activecnt))
           block = 0.; /* do not block at all */
         else
           {
@@ -1400,6 +1426,7 @@ ev_loop (EV_P_ int flags)
             if (expect_false (block < 0.)) block = 0.;
           }
 
+        ++loop_count;
         backend_poll (EV_A_ block);
       }
 
@@ -1422,9 +1449,8 @@ ev_loop (EV_P_ int flags)
 
       call_pending (EV_A);
 
-      if (expect_false (loop_done))
-        break;
     }
+  while (expect_true (activecnt && !loop_done));
 
   if (loop_done == EVUNLOOP_ONE)
     loop_done = EVUNLOOP_CANCEL;