Index: runtime/bin/timer_impl.dart |
diff --git a/runtime/bin/timer_impl.dart b/runtime/bin/timer_impl.dart |
deleted file mode 100644 |
index d82c69c23e69c7a40e7cd5602f973f68800f3cda..0000000000000000000000000000000000000000 |
--- a/runtime/bin/timer_impl.dart |
+++ /dev/null |
@@ -1,200 +0,0 @@ |
-// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
-// for details. All rights reserved. Use of this source code is governed by a |
-// BSD-style license that can be found in the LICENSE file. |
- |
-class _Timer implements Timer { |
- // Set jitter to wake up timer events that would happen in _TIMER_JITTER ms. |
- static const int _TIMER_JITTER = 0; |
- |
- // Disables the timer. |
- static const int _NO_TIMER = -1; |
- |
- static Timer _createTimer(void callback(Timer timer), |
- int milliSeconds, |
- bool repeating) { |
- _EventHandler._start(); |
- if (_timers === null) { |
- _timers = new DoubleLinkedQueue<_Timer>(); |
- } |
- Timer timer = new _Timer._internal(); |
- timer._callback = callback; |
- timer._milliSeconds = milliSeconds; |
- timer._wakeupTime = (new Date.now()).millisecondsSinceEpoch + milliSeconds; |
- timer._repeating = repeating; |
- timer._addTimerToList(); |
- timer._notifyEventHandler(); |
- return timer; |
- } |
- |
- factory _Timer(int milliSeconds, void callback(Timer timer)) { |
- return _createTimer(callback, milliSeconds, false); |
- } |
- |
- factory _Timer.repeating(int milliSeconds, void callback(Timer timer)) { |
- return _createTimer(callback, milliSeconds, true); |
- } |
- |
- _Timer._internal() {} |
- |
- void _clear() { |
- _callback = null; |
- _milliSeconds = 0; |
- _wakeupTime = 0; |
- _repeating = false; |
- } |
- |
- |
- // Cancels a set timer. The timer is removed from the timer list and if |
- // the given timer is the earliest timer the native timer is reset. |
- void cancel() { |
- _clear(); |
- DoubleLinkedQueueEntry<_Timer> entry = _timers.firstEntry(); |
- DoubleLinkedQueueEntry<_Timer> first = _timers.firstEntry(); |
- |
- while (entry !== null) { |
- if (entry.element === this) { |
- entry.remove(); |
- if (first.element == this) { |
- entry = _timers.firstEntry(); |
- _notifyEventHandler(); |
- } |
- return; |
- } |
- entry = entry.nextEntry(); |
- } |
- } |
- |
- void _advanceWakeupTime() { |
- _wakeupTime += _milliSeconds; |
- } |
- |
- // Adds a timer to the timer list and resets the native timer if it is the |
- // earliest timer in the list. Timers with the same wakeup time are enqueued |
- // in order and notified in FIFO order. |
- void _addTimerToList() { |
- if (_callback !== null) { |
- |
- DoubleLinkedQueueEntry<_Timer> entry = _timers.firstEntry(); |
- while (entry !== null) { |
- if (_wakeupTime < entry.element._wakeupTime) { |
- entry.prepend(this); |
- return; |
- } |
- entry = entry.nextEntry(); |
- } |
- _timers.addLast(this); |
- } |
- } |
- |
- |
- void _notifyEventHandler() { |
- if (_handling_callbacks) { |
- // While we are already handling callbacks we will not notify the event |
- // handler. _handleTimeout will call _notifyEventHandler once all pending |
- // timers are processed. |
- return; |
- } |
- |
- if (_timers.firstEntry() === null) { |
- // No pending timers: Close the receive port and let the event handler |
- // know. |
- if (_receivePort !== null) { |
- _EventHandler._sendData(null, _receivePort, _NO_TIMER); |
- _shutdownTimerHandler(); |
- } |
- } else { |
- if (_receivePort === null) { |
- // Create a receive port and register a message handler for the timer |
- // events. |
- _createTimerHandler(); |
- } |
- _EventHandler._sendData(null, |
- _receivePort, |
- _timers.firstEntry().element._wakeupTime); |
- } |
- } |
- |
- |
- // Creates a receive port and registers the timer handler on that |
- // receive port. |
- void _createTimerHandler() { |
- |
- void _handleTimeout() { |
- int currentTime = |
- (new Date.now()).millisecondsSinceEpoch + _TIMER_JITTER; |
- |
- // Collect all pending timers. |
- DoubleLinkedQueueEntry<_Timer> entry = _timers.firstEntry(); |
- var pending_timers = new List(); |
- while (entry !== null) { |
- _Timer timer = entry.element; |
- if (timer._wakeupTime <= currentTime) { |
- entry.remove(); |
- pending_timers.addLast(timer); |
- entry = _timers.firstEntry(); |
- } else { |
- break; |
- } |
- } |
- |
- // Trigger all of the pending timers. New timers added as part of the |
- // callbacks will be enqueued now and notified in the next spin at the |
- // earliest. |
- _handling_callbacks = true; |
- try { |
- for (var timer in pending_timers) { |
- // One of the timers in the pending_timers list can cancel |
- // one of the later timers which will set the callback to |
- // null. |
- if (timer._callback != null) { |
- timer._callback(timer); |
- if (timer._repeating) { |
- timer._advanceWakeupTime(); |
- timer._addTimerToList(); |
- } |
- } |
- } |
- } finally { |
- _handling_callbacks = false; |
- } |
- _notifyEventHandler(); |
- } |
- |
- if(_receivePort === null) { |
- _receivePort = new ReceivePort(); |
- _receivePort.receive((var message, ignored) { |
- _handleTimeout(); |
- }); |
- } |
- } |
- |
- void _shutdownTimerHandler() { |
- _receivePort.close(); |
- _receivePort = null; |
- } |
- |
- |
- // Timers are ordered by wakeup time. |
- static DoubleLinkedQueue<_Timer> _timers; |
- |
- static ReceivePort _receivePort; |
- static bool _handling_callbacks = false; |
- |
- var _callback; |
- int _milliSeconds; |
- int _wakeupTime; |
- bool _repeating; |
-} |
- |
-// Provide a closure which will allocate a Timer object to be able to hook |
-// up the Timer interface in dart:isolate with the implementation here. |
-_getTimerFactoryClosure() { |
- return (int milliSeconds, void callback(Timer timer), bool repeating) { |
- if (repeating) { |
- return new _Timer.repeating(milliSeconds, callback); |
- } |
- return new _Timer(milliSeconds, callback); |
- }; |
-} |
- |
- |