Index: sdk/lib/async/timer.dart |
diff --git a/sdk/lib/async/timer.dart b/sdk/lib/async/timer.dart |
index fafe65228db5060519b0498e950edbd4347e6fe2..70273e449d533fa6553b1ce194139fb5d9aec7c3 100644 |
--- a/sdk/lib/async/timer.dart |
+++ b/sdk/lib/async/timer.dart |
@@ -47,10 +47,17 @@ abstract class Timer { |
if (Zone.current == Zone.ROOT) { |
// No need to bind the callback. We know that the root's timer will |
// be invoked in the root zone. |
- return Zone.current.createTimer(duration, callback); |
+ return Timer._createTimer(duration, callback); |
} |
- return Zone.current.createTimer( |
- duration, Zone.current.bindCallback(callback, runGuarded: true)); |
+ return Zone.current.createTimer(duration, callback); |
+ } |
+ |
+ factory Timer._task(Zone zone, Duration duration, void callback()) { |
+ SingleShotTimerTaskSpecification specification = |
+ new SingleShotTimerTaskSpecification(duration, callback); |
+ Object task = |
+ Zone.current.createTask(specification, _createSingleShotTimerTask); |
+ return new _TimerTaskWrapper(task); |
} |
/** |
@@ -70,14 +77,67 @@ abstract class Timer { |
* scheduled for - even if the actual callback was delayed. |
*/ |
factory Timer.periodic(Duration duration, |
- void callback(Timer timer)) { |
+ void callback(Timer timer)) { |
if (Zone.current == Zone.ROOT) { |
// No need to bind the callback. We know that the root's timer will |
// be invoked in the root zone. |
- return Zone.current.createPeriodicTimer(duration, callback); |
+ return Timer._createPeriodicTimer(duration, callback); |
} |
- return Zone.current.createPeriodicTimer( |
- duration, Zone.current.bindUnaryCallback(callback, runGuarded: true)); |
+ PeriodicTimerTaskSpecification specification = |
+ new PeriodicTimerTaskSpecification(duration, callback); |
+ Object task = |
+ Zone.current.createTask(specification, _createPeriodicTimerTask); |
+ return new _TimerTaskWrapper(task); |
+ } |
+ |
+ factory Timer._periodicTask(Zone zone, Duration duration, |
+ void callback(Timer timer)) { |
+ PeriodicTimerTaskSpecification specification = |
+ new PeriodicTimerTaskSpecification(duration, callback); |
+ Object task = |
+ Zone.current.createTask(specification, _createPeriodicTimerTask); |
+ return new _TimerTaskWrapper(task); |
+ } |
+ |
+ static TimerTask _createSingleShotTimerTask( |
+ SingleShotTimerTaskSpecification specification, Zone zone) { |
+ ZoneCallback registeredCallback = identical(_ROOT_ZONE, zone) |
+ ? specification.callback |
+ : zone.registerCallback(specification.callback); |
+ |
+ TimerTask timerTask; |
+ |
+ Timer timer = Timer._createTimer(specification.duration, () { |
+ timerTask.zone.runTask(timerTask, null, _runSingleShotCallback); |
+ }); |
+ |
+ timerTask = new SingleShotTimerTask(timer, registeredCallback, zone); |
+ return timerTask; |
+ } |
+ |
+ static void _runSingleShotCallback(SingleShotTimerTask timerTask, Object _) { |
+ timerTask.callback(); |
+ } |
+ |
+ static TimerTask _createPeriodicTimerTask( |
+ PeriodicTimerTaskSpecification specification, Zone zone) { |
+ ZoneUnaryCallback registeredCallback = identical(_ROOT_ZONE, zone) |
+ ? specification.callback |
+ : zone.registerUnaryCallback(specification.callback); |
+ |
+ TimerTask timerTask; |
+ |
+ Timer timer = Timer._createPeriodicTimer(specification.duration, (Timer _) { |
+ timerTask.zone.runTask(timerTask, null, _runPeriodicCallback); |
+ }); |
+ |
+ timerTask = new PeriodicTimerTask(timer, registeredCallback, zone); |
+ return timerTask; |
+ } |
+ |
+ static void _runPeriodicCallback(PeriodicTimerTask timerTask, Object _) { |
+ // TODO(floitsch): cache the TimerWrapper? |
+ timerTask.callback(new _TimerTaskWrapper(timerTask)); |
} |
/** |