| 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));
|
| }
|
|
|
| /**
|
|
|