Index: runtime/lib/timer_impl.dart |
diff --git a/runtime/lib/timer_impl.dart b/runtime/lib/timer_impl.dart |
index 8c0a670abdfdaedafdb94b18d33dc589c7e4e2fa..fb0dfa897e49dae346c0cb158cb62af63bf1288a 100644 |
--- a/runtime/lib/timer_impl.dart |
+++ b/runtime/lib/timer_impl.dart |
@@ -146,6 +146,8 @@ class _Timer implements Timer { |
var _indexOrNext; // Index if part of the TimerHeap, link otherwise. |
int _id; // Incrementing id to enable sorting of timers with same expiry. |
+ int _tick = 0; // Backing for [tick], |
+ |
// Get the next available id. We accept collisions and reordering when the |
// _idCount overflows and the timers expire at the same millisecond. |
static int _nextId() { |
@@ -197,6 +199,8 @@ class _Timer implements Timer { |
bool get isActive => _callback != null; |
+ int get tick => _tick; |
+ |
// Cancels a set timer. The timer is removed from the timer heap if it is a |
// non-zero timer. Zero timers are kept in the list as they need to consume |
// the corresponding pending message. |
@@ -363,7 +367,18 @@ class _Timer implements Timer { |
if (!timer._repeating) { |
// Mark timer as inactive. |
timer._callback = null; |
+ } else if (timer._milliSeconds > 0) { |
+ var ms = timer._milliSeconds; |
+ int overdue = |
+ VMLibraryHooks.timerMillisecondClock() - timer._wakeupTime; |
+ if (overdue > ms) { |
+ int missedTicks = overdue ~/ ms; |
+ timer._wakeupTime += missedTicks * ms; |
+ timer._tick += missedTicks; |
+ } |
} |
+ timer._tick += 1; |
+ |
callback(timer); |
// Re-insert repeating timer if not canceled. |
if (timer._repeating && (timer._callback != null)) { |