Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(184)

Unified Diff: runtime/bin/timer_impl.dart

Issue 11337019: Use patching for dart:io. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Address comments Created 8 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);
- };
-}
-
-

Powered by Google App Engine
This is Rietveld 408576698