|
|
@ -1306,69 +1306,61 @@ idle_reify (EV_P) |
|
|
|
} |
|
|
|
#endif |
|
|
|
|
|
|
|
int inline_size |
|
|
|
time_update_monotonic (EV_P) |
|
|
|
{ |
|
|
|
mn_now = get_clock (); |
|
|
|
|
|
|
|
if (expect_true (mn_now - now_floor < MIN_TIMEJUMP * .5)) |
|
|
|
{ |
|
|
|
ev_rt_now = rtmn_diff + mn_now; |
|
|
|
return 0; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
now_floor = mn_now; |
|
|
|
ev_rt_now = ev_time (); |
|
|
|
return 1; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void inline_size |
|
|
|
time_update (EV_P) |
|
|
|
void inline_speed |
|
|
|
time_update (EV_P_ ev_tstamp max_block) |
|
|
|
{ |
|
|
|
int i; |
|
|
|
|
|
|
|
#if EV_USE_MONOTONIC |
|
|
|
if (expect_true (have_monotonic)) |
|
|
|
{ |
|
|
|
if (time_update_monotonic (EV_A)) |
|
|
|
ev_tstamp odiff = rtmn_diff; |
|
|
|
|
|
|
|
mn_now = get_clock (); |
|
|
|
|
|
|
|
/* only fetch the realtime clock every 0.5*MIN_TIMEJUMP seconds */ |
|
|
|
/* interpolate in the meantime */ |
|
|
|
if (expect_true (mn_now - now_floor < MIN_TIMEJUMP * .5)) |
|
|
|
{ |
|
|
|
ev_tstamp odiff = rtmn_diff; |
|
|
|
|
|
|
|
/* loop a few times, before making important decisions. |
|
|
|
* on the choice of "4": one iteration isn't enough, |
|
|
|
* in case we get preempted during the calls to |
|
|
|
* ev_time and get_clock. a second call is almost guaranteed |
|
|
|
* to succeed in that case, though. and looping a few more times |
|
|
|
* doesn't hurt either as we only do this on time-jumps or |
|
|
|
* in the unlikely event of having been preempted here. |
|
|
|
*/ |
|
|
|
for (i = 4; --i; ) |
|
|
|
{ |
|
|
|
rtmn_diff = ev_rt_now - mn_now; |
|
|
|
ev_rt_now = rtmn_diff + mn_now; |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
if (fabs (odiff - rtmn_diff) < MIN_TIMEJUMP) |
|
|
|
return; /* all is well */ |
|
|
|
now_floor = mn_now; |
|
|
|
ev_rt_now = ev_time (); |
|
|
|
|
|
|
|
ev_rt_now = ev_time (); |
|
|
|
mn_now = get_clock (); |
|
|
|
now_floor = mn_now; |
|
|
|
} |
|
|
|
/* loop a few times, before making important decisions. |
|
|
|
* on the choice of "4": one iteration isn't enough, |
|
|
|
* in case we get preempted during the calls to |
|
|
|
* ev_time and get_clock. a second call is almost guaranteed |
|
|
|
* to succeed in that case, though. and looping a few more times |
|
|
|
* doesn't hurt either as we only do this on time-jumps or |
|
|
|
* in the unlikely event of having been preempted here. |
|
|
|
*/ |
|
|
|
for (i = 4; --i; ) |
|
|
|
{ |
|
|
|
rtmn_diff = ev_rt_now - mn_now; |
|
|
|
|
|
|
|
if (fabs (odiff - rtmn_diff) < MIN_TIMEJUMP) |
|
|
|
return; /* all is well */ |
|
|
|
|
|
|
|
ev_rt_now = ev_time (); |
|
|
|
mn_now = get_clock (); |
|
|
|
now_floor = mn_now; |
|
|
|
} |
|
|
|
|
|
|
|
# if EV_PERIODIC_ENABLE |
|
|
|
periodics_reschedule (EV_A); |
|
|
|
periodics_reschedule (EV_A); |
|
|
|
# endif |
|
|
|
/* no timer adjustment, as the monotonic clock doesn't jump */ |
|
|
|
/* timers_reschedule (EV_A_ rtmn_diff - odiff) */ |
|
|
|
} |
|
|
|
/* no timer adjustment, as the monotonic clock doesn't jump */ |
|
|
|
/* timers_reschedule (EV_A_ rtmn_diff - odiff) */ |
|
|
|
} |
|
|
|
else |
|
|
|
#endif |
|
|
|
{ |
|
|
|
ev_rt_now = ev_time (); |
|
|
|
|
|
|
|
if (expect_false (mn_now > ev_rt_now || mn_now < ev_rt_now - MAX_BLOCKTIME - MIN_TIMEJUMP)) |
|
|
|
if (expect_false (mn_now > ev_rt_now || ev_rt_now > mn_now + max_block + MIN_TIMEJUMP)) |
|
|
|
{ |
|
|
|
#if EV_PERIODIC_ENABLE |
|
|
|
periodics_reschedule (EV_A); |
|
|
@ -1452,15 +1444,7 @@ ev_loop (EV_P_ int flags) |
|
|
|
else |
|
|
|
{ |
|
|
|
/* update time to cancel out callback processing overhead */ |
|
|
|
#if EV_USE_MONOTONIC |
|
|
|
if (expect_true (have_monotonic)) |
|
|
|
time_update_monotonic (EV_A); |
|
|
|
else |
|
|
|
#endif |
|
|
|
{ |
|
|
|
ev_rt_now = ev_time (); |
|
|
|
mn_now = ev_rt_now; |
|
|
|
} |
|
|
|
time_update (EV_A_ 1e100); |
|
|
|
|
|
|
|
block = MAX_BLOCKTIME; |
|
|
|
|
|
|
@ -1483,10 +1467,10 @@ ev_loop (EV_P_ int flags) |
|
|
|
|
|
|
|
++loop_count; |
|
|
|
backend_poll (EV_A_ block); |
|
|
|
} |
|
|
|
|
|
|
|
/* update ev_rt_now, do magic */ |
|
|
|
time_update (EV_A); |
|
|
|
/* update ev_rt_now, do magic */ |
|
|
|
time_update (EV_A_ block); |
|
|
|
} |
|
|
|
|
|
|
|
/* queue pending timers and reschedule them */ |
|
|
|
timers_reify (EV_A); /* relative timers called last */ |
|
|
|