*** empty log message ***

This commit is contained in:
Marc Alexander Lehmann 2007-12-11 18:36:11 +00:00
parent c172f20f57
commit 363bcb2e34
1 changed files with 40 additions and 56 deletions

96
ev.c
View File

@ -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;
ev_rt_now = rtmn_diff + mn_now;
return;
}
/* 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;
now_floor = mn_now;
ev_rt_now = ev_time ();
if (fabs (odiff - rtmn_diff) < MIN_TIMEJUMP)
return; /* all is well */
/* 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 = ev_time ();
mn_now = get_clock ();
now_floor = 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 */