diff options
| -rw-r--r-- | ev.c | 98 | 
1 files changed, 41 insertions, 57 deletions
| @@ -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 */ | 
