Prevent overflow in std timer driver
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
This commit is contained in:
parent
acce0f1d25
commit
6c9420978b
1 changed files with 6 additions and 2 deletions
|
@ -5,6 +5,7 @@ use std::mem::MaybeUninit;
|
|||
use std::sync::{Condvar, Mutex, Once};
|
||||
use std::time::Duration as StdDuration;
|
||||
use std::time::Instant as StdInstant;
|
||||
use std::time::SystemTime;
|
||||
use std::{ptr, thread};
|
||||
|
||||
use crate::time::driver::{AlarmHandle, Driver};
|
||||
|
@ -63,6 +64,7 @@ impl TimeDriver {
|
|||
}
|
||||
|
||||
fn alarm_thread() {
|
||||
let zero = unsafe { DRIVER.zero_instant.read() };
|
||||
loop {
|
||||
let now = DRIVER.now();
|
||||
|
||||
|
@ -86,8 +88,10 @@ impl TimeDriver {
|
|||
}
|
||||
}
|
||||
|
||||
let until =
|
||||
unsafe { DRIVER.zero_instant.read() } + StdDuration::from_micros(next_alarm);
|
||||
// Ensure we don't overflow
|
||||
let until = zero
|
||||
.checked_add(StdDuration::from_micros(next_alarm))
|
||||
.unwrap_or(zero + StdDuration::from_secs(1));
|
||||
|
||||
unsafe { DRIVER.signaler.as_ref() }.wait_until(until);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue