diff options
| author | Frostie314159 <[email protected]> | 2024-03-31 20:48:05 +0200 |
|---|---|---|
| committer | GitHub <[email protected]> | 2024-03-31 20:48:05 +0200 |
| commit | 67c9cc2c4b886e6962ecdd6eff8794b14c1accdc (patch) | |
| tree | f176ab269949d26f48e04c950cebc5489bae8c56 /embassy-time/src/queue_generic.rs | |
| parent | a2f9aa592ec61beb247065003016515f0d423c13 (diff) | |
| parent | 6634cc90bcd3eb25b64712688920f383584b2964 (diff) | |
Merge branch 'embassy-rs:main' into ticker_send_sync
Diffstat (limited to 'embassy-time/src/queue_generic.rs')
| -rw-r--r-- | embassy-time/src/queue_generic.rs | 112 |
1 files changed, 12 insertions, 100 deletions
diff --git a/embassy-time/src/queue_generic.rs b/embassy-time/src/queue_generic.rs index 77947ab29..cf7a986d5 100644 --- a/embassy-time/src/queue_generic.rs +++ b/embassy-time/src/queue_generic.rs | |||
| @@ -3,10 +3,10 @@ use core::cmp::{min, Ordering}; | |||
| 3 | use core::task::Waker; | 3 | use core::task::Waker; |
| 4 | 4 | ||
| 5 | use critical_section::Mutex; | 5 | use critical_section::Mutex; |
| 6 | use embassy_time_driver::{allocate_alarm, set_alarm, set_alarm_callback, AlarmHandle}; | ||
| 7 | use embassy_time_queue_driver::TimerQueue; | ||
| 6 | use heapless::Vec; | 8 | use heapless::Vec; |
| 7 | 9 | ||
| 8 | use crate::driver::{allocate_alarm, set_alarm, set_alarm_callback, AlarmHandle}; | ||
| 9 | use crate::queue::TimerQueue; | ||
| 10 | use crate::Instant; | 10 | use crate::Instant; |
| 11 | 11 | ||
| 12 | #[cfg(feature = "generic-queue-8")] | 12 | #[cfg(feature = "generic-queue-8")] |
| @@ -167,111 +167,25 @@ impl Queue { | |||
| 167 | } | 167 | } |
| 168 | 168 | ||
| 169 | impl TimerQueue for Queue { | 169 | impl TimerQueue for Queue { |
| 170 | fn schedule_wake(&'static self, at: Instant, waker: &Waker) { | 170 | fn schedule_wake(&'static self, at: u64, waker: &Waker) { |
| 171 | Queue::schedule_wake(self, at, waker); | 171 | Queue::schedule_wake(self, Instant::from_ticks(at), waker); |
| 172 | } | 172 | } |
| 173 | } | 173 | } |
| 174 | 174 | ||
| 175 | crate::timer_queue_impl!(static QUEUE: Queue = Queue::new()); | 175 | embassy_time_queue_driver::timer_queue_impl!(static QUEUE: Queue = Queue::new()); |
| 176 | 176 | ||
| 177 | #[cfg(test)] | 177 | #[cfg(test)] |
| 178 | #[cfg(feature = "mock-driver")] | ||
| 178 | mod tests { | 179 | mod tests { |
| 179 | use core::cell::Cell; | 180 | use core::cell::Cell; |
| 180 | use core::task::{RawWaker, RawWakerVTable, Waker}; | 181 | use core::task::{RawWaker, RawWakerVTable, Waker}; |
| 181 | use std::rc::Rc; | 182 | use std::rc::Rc; |
| 182 | use std::sync::Mutex; | ||
| 183 | 183 | ||
| 184 | use serial_test::serial; | 184 | use serial_test::serial; |
| 185 | 185 | ||
| 186 | use crate::driver::{AlarmHandle, Driver}; | 186 | use crate::driver_mock::MockDriver; |
| 187 | use crate::queue_generic::QUEUE; | 187 | use crate::queue_generic::QUEUE; |
| 188 | use crate::Instant; | 188 | use crate::{Duration, Instant}; |
| 189 | |||
| 190 | struct InnerTestDriver { | ||
| 191 | now: u64, | ||
| 192 | alarm: u64, | ||
| 193 | callback: fn(*mut ()), | ||
| 194 | ctx: *mut (), | ||
| 195 | } | ||
| 196 | |||
| 197 | impl InnerTestDriver { | ||
| 198 | const fn new() -> Self { | ||
| 199 | Self { | ||
| 200 | now: 0, | ||
| 201 | alarm: u64::MAX, | ||
| 202 | callback: Self::noop, | ||
| 203 | ctx: core::ptr::null_mut(), | ||
| 204 | } | ||
| 205 | } | ||
| 206 | |||
| 207 | fn noop(_ctx: *mut ()) {} | ||
| 208 | } | ||
| 209 | |||
| 210 | unsafe impl Send for InnerTestDriver {} | ||
| 211 | |||
| 212 | struct TestDriver(Mutex<InnerTestDriver>); | ||
| 213 | |||
| 214 | impl TestDriver { | ||
| 215 | const fn new() -> Self { | ||
| 216 | Self(Mutex::new(InnerTestDriver::new())) | ||
| 217 | } | ||
| 218 | |||
| 219 | fn reset(&self) { | ||
| 220 | *self.0.lock().unwrap() = InnerTestDriver::new(); | ||
| 221 | } | ||
| 222 | |||
| 223 | fn set_now(&self, now: u64) { | ||
| 224 | let notify = { | ||
| 225 | let mut inner = self.0.lock().unwrap(); | ||
| 226 | |||
| 227 | if inner.now < now { | ||
| 228 | inner.now = now; | ||
| 229 | |||
| 230 | if inner.alarm <= now { | ||
| 231 | inner.alarm = u64::MAX; | ||
| 232 | |||
| 233 | Some((inner.callback, inner.ctx)) | ||
| 234 | } else { | ||
| 235 | None | ||
| 236 | } | ||
| 237 | } else { | ||
| 238 | panic!("Going back in time?"); | ||
| 239 | } | ||
| 240 | }; | ||
| 241 | |||
| 242 | if let Some((callback, ctx)) = notify { | ||
| 243 | (callback)(ctx); | ||
| 244 | } | ||
| 245 | } | ||
| 246 | } | ||
| 247 | |||
| 248 | impl Driver for TestDriver { | ||
| 249 | fn now(&self) -> u64 { | ||
| 250 | self.0.lock().unwrap().now | ||
| 251 | } | ||
| 252 | |||
| 253 | unsafe fn allocate_alarm(&self) -> Option<AlarmHandle> { | ||
| 254 | Some(AlarmHandle::new(0)) | ||
| 255 | } | ||
| 256 | |||
| 257 | fn set_alarm_callback(&self, _alarm: AlarmHandle, callback: fn(*mut ()), ctx: *mut ()) { | ||
| 258 | let mut inner = self.0.lock().unwrap(); | ||
| 259 | |||
| 260 | inner.callback = callback; | ||
| 261 | inner.ctx = ctx; | ||
| 262 | } | ||
| 263 | |||
| 264 | fn set_alarm(&self, _alarm: AlarmHandle, timestamp: u64) -> bool { | ||
| 265 | let mut inner = self.0.lock().unwrap(); | ||
| 266 | |||
| 267 | if timestamp <= inner.now { | ||
| 268 | false | ||
| 269 | } else { | ||
| 270 | inner.alarm = timestamp; | ||
| 271 | true | ||
| 272 | } | ||
| 273 | } | ||
| 274 | } | ||
| 275 | 189 | ||
| 276 | struct TestWaker { | 190 | struct TestWaker { |
| 277 | pub awoken: Rc<Cell<bool>>, | 191 | pub awoken: Rc<Cell<bool>>, |
| @@ -312,10 +226,8 @@ mod tests { | |||
| 312 | } | 226 | } |
| 313 | } | 227 | } |
| 314 | 228 | ||
| 315 | crate::time_driver_impl!(static DRIVER: TestDriver = TestDriver::new()); | ||
| 316 | |||
| 317 | fn setup() { | 229 | fn setup() { |
| 318 | DRIVER.reset(); | 230 | MockDriver::get().reset(); |
| 319 | critical_section::with(|cs| *QUEUE.inner.borrow_ref_mut(cs) = None); | 231 | critical_section::with(|cs| *QUEUE.inner.borrow_ref_mut(cs) = None); |
| 320 | } | 232 | } |
| 321 | 233 | ||
| @@ -382,13 +294,13 @@ mod tests { | |||
| 382 | 294 | ||
| 383 | assert!(!waker.awoken.get()); | 295 | assert!(!waker.awoken.get()); |
| 384 | 296 | ||
| 385 | DRIVER.set_now(Instant::from_secs(99).as_ticks()); | 297 | MockDriver::get().advance(Duration::from_secs(99)); |
| 386 | 298 | ||
| 387 | assert!(!waker.awoken.get()); | 299 | assert!(!waker.awoken.get()); |
| 388 | 300 | ||
| 389 | assert_eq!(queue_len(), 1); | 301 | assert_eq!(queue_len(), 1); |
| 390 | 302 | ||
| 391 | DRIVER.set_now(Instant::from_secs(100).as_ticks()); | 303 | MockDriver::get().advance(Duration::from_secs(1)); |
| 392 | 304 | ||
| 393 | assert!(waker.awoken.get()); | 305 | assert!(waker.awoken.get()); |
| 394 | 306 | ||
| @@ -404,7 +316,7 @@ mod tests { | |||
| 404 | 316 | ||
| 405 | QUEUE.schedule_wake(Instant::from_secs(100), &waker.waker); | 317 | QUEUE.schedule_wake(Instant::from_secs(100), &waker.waker); |
| 406 | 318 | ||
| 407 | DRIVER.set_now(Instant::from_secs(50).as_ticks()); | 319 | MockDriver::get().advance(Duration::from_secs(50)); |
| 408 | 320 | ||
| 409 | let waker2 = TestWaker::new(); | 321 | let waker2 = TestWaker::new(); |
| 410 | 322 | ||
