aboutsummaryrefslogtreecommitdiff
path: root/src/time/driver/wheel/mod.rs
diff options
context:
space:
mode:
authorHaibo Huang <hhb@google.com>2021-02-09 18:18:56 -0800
committerStephen Hines <srhines@google.com>2021-03-03 21:34:52 +0000
commite3d8d80d2d8744ccdcd175323e0864c8f30fcedc (patch)
tree16d053e70d21e456d52f4a7762ee41441342b7a2 /src/time/driver/wheel/mod.rs
parent925d648e545e70d6a4faae3d7efe5e0de885f922 (diff)
downloadtokio-e3d8d80d2d8744ccdcd175323e0864c8f30fcedc.tar.gz
Upgrade rust/crates/tokio to 1.2.0
Test: make Change-Id: Ib0f6a5201b51e9d122b6e867388a3856e16f803a
Diffstat (limited to 'src/time/driver/wheel/mod.rs')
-rw-r--r--src/time/driver/wheel/mod.rs17
1 files changed, 13 insertions, 4 deletions
diff --git a/src/time/driver/wheel/mod.rs b/src/time/driver/wheel/mod.rs
index 164cac4..24bf517 100644
--- a/src/time/driver/wheel/mod.rs
+++ b/src/time/driver/wheel/mod.rs
@@ -122,6 +122,13 @@ impl Wheel {
if when == u64::max_value() {
self.pending.remove(item);
} else {
+ debug_assert!(
+ self.elapsed <= when,
+ "elapsed={}; when={}",
+ self.elapsed,
+ when
+ );
+
let level = self.level_for(when);
self.levels[level].remove_entry(item);
@@ -281,15 +288,17 @@ impl Wheel {
}
fn level_for(elapsed: u64, when: u64) -> usize {
- let mut masked = elapsed ^ when;
+ const SLOT_MASK: u64 = (1 << 6) - 1;
+
+ // Mask in the trailing bits ignored by the level calculation in order to cap
+ // the possible leading zeros
+ let mut masked = elapsed ^ when | SLOT_MASK;
if masked >= MAX_DURATION {
// Fudge the timer into the top level
masked = MAX_DURATION - 1;
}
- assert!(masked != 0, "elapsed={}; when={}", elapsed, when);
-
let leading_zeros = masked.leading_zeros() as usize;
let significant = 63 - leading_zeros;
@@ -302,7 +311,7 @@ mod test {
#[test]
fn test_level_for() {
- for pos in 1..64 {
+ for pos in 0..64 {
assert_eq!(
0,
level_for(0, pos),