return backend;
}
+unsigned int
+ev_loop_count (EV_P)
+{
+ return loop_count;
+}
+
static void noinline
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"))
? 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))
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);
{
ev_tstamp block;
- if (flags & EVLOOP_NONBLOCK || idlecnt)
+ if (expect_false (flags & EVLOOP_NONBLOCK || idlecnt || !activecnt))
block = 0.; /* do not block at all */
else
{
if (expect_false (block < 0.)) block = 0.;
}
+ ++loop_count;
backend_poll (EV_A_ block);
}
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;