From 561a665f3655ae68c4f886bde752c04c2b3d56f7 Mon Sep 17 00:00:00 2001 From: Samuel Tardieu Date: Tue, 8 Feb 2022 10:17:47 +0100 Subject: [PATCH 1/2] time: use bit manipulation instead of modulo `level_range()` always return a strictly positive power of 2. --- tokio/src/time/driver/wheel/level.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tokio/src/time/driver/wheel/level.rs b/tokio/src/time/driver/wheel/level.rs index 7fd2266bb8e..4f19a574c37 100644 --- a/tokio/src/time/driver/wheel/level.rs +++ b/tokio/src/time/driver/wheel/level.rs @@ -143,8 +143,7 @@ impl Level { let level_range = level_range(self.level); let slot_range = slot_range(self.level); - // TODO: This can probably be simplified w/ power of 2 math - let level_start = now - (now % level_range); + let level_start = now & !(level_range - 1); let mut deadline = level_start + slot as u64 * slot_range; if deadline <= now { From bc4059bd8658908836ca273cb0798e96878ce201 Mon Sep 17 00:00:00 2001 From: Samuel Tardieu Date: Tue, 8 Feb 2022 18:44:42 +0100 Subject: [PATCH 2/2] time: add comment to explain the bit manipulation --- tokio/src/time/driver/wheel/level.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tokio/src/time/driver/wheel/level.rs b/tokio/src/time/driver/wheel/level.rs index 4f19a574c37..878754177b9 100644 --- a/tokio/src/time/driver/wheel/level.rs +++ b/tokio/src/time/driver/wheel/level.rs @@ -143,6 +143,8 @@ impl Level { let level_range = level_range(self.level); let slot_range = slot_range(self.level); + // Compute the start date of the current level by masking the low bits + // of `now` (`level_range` is a power of 2). let level_start = now & !(level_range - 1); let mut deadline = level_start + slot as u64 * slot_range;