| Index: sdk/lib/async/timer.dart
|
| diff --git a/sdk/lib/async/timer.dart b/sdk/lib/async/timer.dart
|
| index fafe65228db5060519b0498e950edbd4347e6fe2..134bbef31dc8bf55639841cbfea4d0ea5d6c3af0 100644
|
| --- a/sdk/lib/async/timer.dart
|
| +++ b/sdk/lib/async/timer.dart
|
| @@ -47,10 +47,13 @@ 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));
|
| + SingleShotTimerTaskSpecification specification =
|
| + new SingleShotTimerTaskSpecification(duration, callback);
|
| + Task task =
|
| + Zone.current.createTask(specification, _createSingleShotTimerTask);
|
| + return new _TimerTaskWrapper(task);
|
| }
|
|
|
| /**
|
| @@ -70,14 +73,60 @@ 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);
|
| + Task task =
|
| + Zone.current.createTask(specification, _createPeriodicTimerTask);
|
| + return new _TimerTaskWrapper(task);
|
| + }
|
| +
|
| + static TimerTask _createSingleShotTimerTask(
|
| + SingleShotTimerTaskSpecification specification, Zone zone) {
|
| + ZoneCallback registeredCallback =
|
| + zone.registerCallback(specification.callback);
|
| +
|
| + TimerTask timerTask;
|
| +
|
| + Timer timer = Timer._createTimer(specification.duration, () {
|
| + timerTask.zone.runTask(timerTask, null, _runSingleShotCallback);
|
| + });
|
| +
|
| + timerTask = new SingleShotTimerTask(
|
| + timer, registeredCallback, specification, zone);
|
| + return timerTask;
|
| + }
|
| +
|
| + static void _runSingleShotCallback(
|
| + SingleShotTimerTask timerTask, Object _, Zone zone) {
|
| + timerTask.callback();
|
| + }
|
| +
|
| + static TimerTask _createPeriodicTimerTask(
|
| + PeriodicTimerTaskSpecification specification, Zone zone) {
|
| + ZoneUnaryCallback registeredCallback =
|
| + zone.registerUnaryCallback(specification.callback);
|
| +
|
| + TimerTask timerTask;
|
| +
|
| + Timer timer = Timer._createPeriodicTimer(specification.duration, (Timer _) {
|
| + timerTask.zone.runTask(timerTask, null, _runPeriodicCallback);
|
| + });
|
| +
|
| + timerTask = new PeriodicTimerTask(
|
| + timer, registeredCallback, specification, zone);
|
| + return timerTask;
|
| + }
|
| +
|
| + static void _runPeriodicCallback(
|
| + PeriodicTimerTask timerTask, Object _, Zone zone) {
|
| + // TODO(floitsch): cache the TimerWrapper?
|
| + timerTask.callback(new _TimerTaskWrapper(timerTask));
|
| }
|
|
|
| /**
|
|
|