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
					
				| @ -5,6 +5,7 @@ use std::mem::MaybeUninit; | |||||||
| use std::sync::{Condvar, Mutex, Once}; | use std::sync::{Condvar, Mutex, Once}; | ||||||
| use std::time::Duration as StdDuration; | use std::time::Duration as StdDuration; | ||||||
| use std::time::Instant as StdInstant; | use std::time::Instant as StdInstant; | ||||||
|  | use std::time::SystemTime; | ||||||
| use std::{ptr, thread}; | use std::{ptr, thread}; | ||||||
| 
 | 
 | ||||||
| use crate::time::driver::{AlarmHandle, Driver}; | use crate::time::driver::{AlarmHandle, Driver}; | ||||||
| @ -63,6 +64,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 +88,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(zero + StdDuration::from_secs(1)); | ||||||
| 
 | 
 | ||||||
|             unsafe { DRIVER.signaler.as_ref() }.wait_until(until); |             unsafe { DRIVER.signaler.as_ref() }.wait_until(until); | ||||||
|         } |         } | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user