Chromium Code Reviews| Index: Source/platform/Timer.cpp |
| diff --git a/Source/platform/Timer.cpp b/Source/platform/Timer.cpp |
| index 796bc2cf95a4d569e80673e3ab5441f0a9ebacbd..7295542ee380a30e94c68d4dc566a03e93eb6896 100644 |
| --- a/Source/platform/Timer.cpp |
| +++ b/Source/platform/Timer.cpp |
| @@ -105,12 +105,7 @@ void TimerBase::setNextFireTime(double now, double delay) |
| // TODO(skyostil): Move timer alignment into the scheduler. |
| m_webScheduler->postTimerTaskAt(m_location, m_cancellableTimerTask, m_nextFireTime); |
| } else { |
| - // Round the delay up to the nearest millisecond to be consistant with the |
| - // previous behavior of BlinkPlatformImpl::setSharedTimerFireInterval. |
| - long long delayMs = static_cast<long long>(ceil((newTime - now) * 1000.0)); |
| - if (delayMs < 0) |
| - delayMs = 0; |
| - m_webScheduler->postTimerTask(m_location, m_cancellableTimerTask, delayMs); |
| + m_webScheduler->postTimerTask(m_location, m_cancellableTimerTask, newTime - now); |
| } |
| } |
| } |
| @@ -126,10 +121,14 @@ void TimerBase::runInternal() |
| TRACE_EVENT_SET_SAMPLING_STATE("blink", "BlinkInternal"); |
| m_nextFireTime = 0; |
| - // Note: repeating timers drift, but this is preserving the functionality of the old timer heap. |
| - // See crbug.com/328700. |
| - if (m_repeatInterval) |
| - setNextFireTime(monotonicallyIncreasingTime(), m_repeatInterval); |
| + if (m_repeatInterval) { |
| + double now = monotonicallyIncreasingTime(); |
| + ASSERT(now >= m_unalignedNextFireTime); |
| + // This computation should be drift free, and it will cope if we miss a beat, |
| + // which can easily happen if the thread is busy. |
| + double intervalToNextFireTime = m_repeatInterval - fmod(now - m_unalignedNextFireTime, m_repeatInterval); |
|
Sami
2015/08/03 12:57:21
If (now - m_unalignedNextFireTime) % m_repeatInter
alex clarke (OOO till 29th)
2015/08/03 13:37:26
Interesting point. I think for this API there's n
|
| + setNextFireTime(now, intervalToNextFireTime); |
| + } |
| fired(); |
| TRACE_EVENT_SET_SAMPLING_STATE("blink", "Sleeping"); |
| } |