blob: 01c2493da204ed948fcfcb39c8542e6bf1245f6b [file] [log] [blame]
// 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 internal;
class Timeout implements Comparable<Timeout> {
int deadline; // milliseconds since the Unix epoch.
SendPort port;
Timeout(this.port, this.deadline);
int compareTo(Timeout other) => deadline - other.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;
}