aboutsummaryrefslogtreecommitdiff
path: root/embassy-std
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2021-08-03 22:08:13 +0200
committerDario Nieuwenhuis <[email protected]>2021-08-05 19:14:09 +0200
commit0ea6a2d8905a146c8899239fe52e739404f13e7e (patch)
tree0fdc47c7558a062787afea6d1f6a7d0ce5a2f660 /embassy-std
parenta4c0ee6df7cd54a3b31524e2c6aaf2b15b61a4d2 (diff)
time: replace dyn clock/alarm with a global Driver trait
Diffstat (limited to 'embassy-std')
-rw-r--r--embassy-std/src/lib.rs38
1 files changed, 20 insertions, 18 deletions
diff --git a/embassy-std/src/lib.rs b/embassy-std/src/lib.rs
index 688054cb9..d85137e9a 100644
--- a/embassy-std/src/lib.rs
+++ b/embassy-std/src/lib.rs
@@ -1,6 +1,6 @@
1use embassy::executor::{raw, Spawner}; 1use embassy::executor::{raw, Spawner};
2use embassy::time::driver::{AlarmHandle, Driver};
2use embassy::time::TICKS_PER_SECOND; 3use embassy::time::TICKS_PER_SECOND;
3use embassy::time::{Alarm, Clock};
4use std::marker::PhantomData; 4use std::marker::PhantomData;
5use std::mem::MaybeUninit; 5use std::mem::MaybeUninit;
6use std::ptr; 6use std::ptr;
@@ -8,28 +8,31 @@ use std::sync::{Condvar, Mutex};
8use std::time::{Duration as StdDuration, Instant as StdInstant}; 8use std::time::{Duration as StdDuration, Instant as StdInstant};
9 9
10static mut CLOCK_ZERO: MaybeUninit<StdInstant> = MaybeUninit::uninit(); 10static mut CLOCK_ZERO: MaybeUninit<StdInstant> = MaybeUninit::uninit();
11struct StdClock; 11
12impl Clock for StdClock { 12static mut ALARM_AT: u64 = u64::MAX;
13 fn now(&self) -> u64 { 13static mut NEXT_ALARM_ID: u8 = 0;
14
15struct TimeDriver;
16embassy::time_driver_impl!(TimeDriver);
17
18impl Driver for TimeDriver {
19 fn now() -> u64 {
14 let zero = unsafe { CLOCK_ZERO.as_ptr().read() }; 20 let zero = unsafe { CLOCK_ZERO.as_ptr().read() };
15 let dur = StdInstant::now().duration_since(zero); 21 let dur = StdInstant::now().duration_since(zero);
16 dur.as_secs() * (TICKS_PER_SECOND as u64) 22 dur.as_secs() * (TICKS_PER_SECOND as u64)
17 + (dur.subsec_nanos() as u64) * (TICKS_PER_SECOND as u64) / 1_000_000_000 23 + (dur.subsec_nanos() as u64) * (TICKS_PER_SECOND as u64) / 1_000_000_000
18 } 24 }
19}
20 25
21static mut ALARM_AT: u64 = u64::MAX; 26 unsafe fn allocate_alarm() -> Option<AlarmHandle> {
22 27 let r = NEXT_ALARM_ID;
23pub struct StdAlarm; 28 NEXT_ALARM_ID += 1;
24impl Alarm for StdAlarm { 29 Some(AlarmHandle::new(r))
25 fn set_callback(&self, _callback: fn(*mut ()), _ctx: *mut ()) {}
26
27 fn set(&self, timestamp: u64) {
28 unsafe { ALARM_AT = timestamp }
29 } 30 }
30 31
31 fn clear(&self) { 32 fn set_alarm_callback(_alarm: AlarmHandle, _callback: fn(*mut ()), _ctx: *mut ()) {}
32 unsafe { ALARM_AT = u64::MAX } 33
34 fn set_alarm(_alarm: AlarmHandle, timestamp: u64) {
35 unsafe { ALARM_AT = ALARM_AT.min(timestamp) }
33 } 36 }
34} 37}
35 38
@@ -53,7 +56,8 @@ impl Signaler {
53 if alarm_at == u64::MAX { 56 if alarm_at == u64::MAX {
54 signaled = self.condvar.wait(signaled).unwrap(); 57 signaled = self.condvar.wait(signaled).unwrap();
55 } else { 58 } else {
56 let now = StdClock.now(); 59 unsafe { ALARM_AT = u64::MAX };
60 let now = TimeDriver::now();
57 if now >= alarm_at { 61 if now >= alarm_at {
58 break; 62 break;
59 } 63 }
@@ -92,7 +96,6 @@ impl Executor {
92 pub fn new() -> Self { 96 pub fn new() -> Self {
93 unsafe { 97 unsafe {
94 CLOCK_ZERO.as_mut_ptr().write(StdInstant::now()); 98 CLOCK_ZERO.as_mut_ptr().write(StdInstant::now());
95 embassy::time::set_clock(&StdClock);
96 } 99 }
97 100
98 Self { 101 Self {
@@ -107,7 +110,6 @@ impl Executor {
107 /// This function never returns. 110 /// This function never returns.
108 pub fn run(&'static mut self, init: impl FnOnce(Spawner)) -> ! { 111 pub fn run(&'static mut self, init: impl FnOnce(Spawner)) -> ! {
109 self.inner.set_signal_ctx(&self.signaler as *const _ as _); 112 self.inner.set_signal_ctx(&self.signaler as *const _ as _);
110 self.inner.set_alarm(&StdAlarm);
111 113
112 init(unsafe { self.inner.spawner() }); 114 init(unsafe { self.inner.spawner() });
113 115