439: Prevent overflow in std timer driver r=lulf a=lulf

This prevents the std time driver from overflowing when setting the next
wakeup time. If an overflow occurs, default to sleeping up to 1 second.

Fixes #438

Co-authored-by: Ulf Lilleengen <ulf.lilleengen@gmail.com>
This commit is contained in:
bors[bot] 2021-10-20 13:16:25 +00:00 committed by GitHub
commit a895b6351f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -63,6 +63,7 @@ impl TimeDriver {
} }
fn alarm_thread() { fn alarm_thread() {
let zero = unsafe { DRIVER.zero_instant.read() };
loop { loop {
let now = DRIVER.now(); let now = DRIVER.now();
@ -86,8 +87,10 @@ impl TimeDriver {
} }
} }
let until = // Ensure we don't overflow
unsafe { DRIVER.zero_instant.read() } + StdDuration::from_micros(next_alarm); let until = zero
.checked_add(StdDuration::from_micros(next_alarm))
.unwrap_or_else(|| StdInstant::now() + StdDuration::from_secs(1));
unsafe { DRIVER.signaler.as_ref() }.wait_until(until); unsafe { DRIVER.signaler.as_ref() }.wait_until(until);
} }