| Index: mojo/public/dart/src/timer_queue.dart | 
| diff --git a/mojo/public/dart/src/timer_queue.dart b/mojo/public/dart/src/timer_queue.dart | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..477337cda59bf87ff769f7963aca51ca6c870e8b | 
| --- /dev/null | 
| +++ b/mojo/public/dart/src/timer_queue.dart | 
| @@ -0,0 +1,53 @@ | 
| +// Copyright 2014 The Chromium Authors. All rights reserved. | 
| +// Use of this source code is governed by a BSD-style license that can be | 
| +// found in the LICENSE file. | 
| + | 
| +part of core; | 
| + | 
| +class Timeout implements Comparable<Timeout> { | 
| +  int deadline;  // milliseconds since the Unix epoch. | 
| +  SendPort port; | 
| + | 
| +  Timeout(this.port, this.deadline); | 
| + | 
| +  int compareTo(Timeout other)  => other.daedline - deadline; | 
| +} | 
| + | 
| +class TimerQueue { | 
| +  SplayTreeSet _set; | 
| +  Timeout _nextTimer; | 
| + | 
| +  TimerQueue() : _set = new SplayTreeSet(); | 
| + | 
| +  void updateTimer(SendPort port, int deadline) { | 
| +    var removedTimeout = null; | 
| +    _set.removeWhere((timeout) { | 
| +      if (timeout.port == port) { | 
| +        removedTimeout = timeout; | 
| +        return true; | 
| +      } | 
| +      return false; | 
| +    }); | 
| + | 
| +    if ((removedTimeout == null) && (deadline >= 0)) { | 
| +      _set.add(new Timeout(port, deadline)); | 
| +    } else { | 
| +      if (deadline > 0) { | 
| +        removedTimeout.deadline = deadline; | 
| +        _set.add(removedTimeout); | 
| +      } | 
| +    } | 
| + | 
| +    if (_set.isNotEmpty) { | 
| +      _nextTimer = _set.first; | 
| +    } else { | 
| +      _nextTimer = null; | 
| +    } | 
| +  } | 
| + | 
| +  void removeCurrent() => updateTimer(currentPort, -1); | 
| + | 
| +  bool get hasTimer => _nextTimer != null; | 
| +  int get currentTimeout => _nextTimer.deadline; | 
| +  SendPort get currentPort => _nextTimer.port; | 
| +} | 
|  |