diff options
author | Haibo Huang <hhb@google.com> | 2021-02-09 18:18:56 -0800 |
---|---|---|
committer | Stephen Hines <srhines@google.com> | 2021-03-03 21:34:52 +0000 |
commit | e3d8d80d2d8744ccdcd175323e0864c8f30fcedc (patch) | |
tree | 16d053e70d21e456d52f4a7762ee41441342b7a2 /src/time/driver/wheel/mod.rs | |
parent | 925d648e545e70d6a4faae3d7efe5e0de885f922 (diff) | |
download | tokio-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.rs | 17 |
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), |