aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--embassy-time/src/driver_mock.rs46
1 files changed, 34 insertions, 12 deletions
diff --git a/embassy-time/src/driver_mock.rs b/embassy-time/src/driver_mock.rs
index d1c21ab28..5828dde41 100644
--- a/embassy-time/src/driver_mock.rs
+++ b/embassy-time/src/driver_mock.rs
@@ -58,13 +58,17 @@ impl MockDriver {
58 58
59 inner.now = inner.now + duration; 59 inner.now = inner.now + duration;
60 60
61 if inner.alarm.timestamp <= inner.now.as_ticks() { 61 let now = inner.now.as_ticks();
62 inner.alarm.timestamp = u64::MAX;
63 62
64 Some((inner.alarm.callback, inner.alarm.ctx)) 63 inner
65 } else { 64 .alarm
66 None 65 .as_mut()
67 } 66 .filter(|alarm| alarm.timestamp <= now)
67 .map(|alarm| {
68 alarm.timestamp = u64::MAX;
69
70 (alarm.callback, alarm.ctx)
71 })
68 }) 72 })
69 }; 73 };
70 74
@@ -80,15 +84,29 @@ impl Driver for MockDriver {
80 } 84 }
81 85
82 unsafe fn allocate_alarm(&self) -> Option<AlarmHandle> { 86 unsafe fn allocate_alarm(&self) -> Option<AlarmHandle> {
83 Some(AlarmHandle::new(0)) 87 critical_section::with(|cs| {
88 let mut inner = self.0.borrow_ref_mut(cs);
89
90 if inner.alarm.is_some() {
91 None
92 } else {
93 inner.alarm.replace(AlarmState::new());
94
95 Some(AlarmHandle::new(0))
96 }
97 })
84 } 98 }
85 99
86 fn set_alarm_callback(&self, _alarm: AlarmHandle, callback: fn(*mut ()), ctx: *mut ()) { 100 fn set_alarm_callback(&self, _alarm: AlarmHandle, callback: fn(*mut ()), ctx: *mut ()) {
87 critical_section::with(|cs| { 101 critical_section::with(|cs| {
88 let mut inner = self.0.borrow_ref_mut(cs); 102 let mut inner = self.0.borrow_ref_mut(cs);
89 103
90 inner.alarm.callback = callback; 104 let Some(alarm) = inner.alarm.as_mut() else {
91 inner.alarm.ctx = ctx; 105 panic!("Alarm not allocated");
106 };
107
108 alarm.callback = callback;
109 alarm.ctx = ctx;
92 }); 110 });
93 } 111 }
94 112
@@ -99,7 +117,11 @@ impl Driver for MockDriver {
99 if timestamp <= inner.now.as_ticks() { 117 if timestamp <= inner.now.as_ticks() {
100 false 118 false
101 } else { 119 } else {
102 inner.alarm.timestamp = timestamp; 120 let Some(alarm) = inner.alarm.as_mut() else {
121 panic!("Alarm not allocated");
122 };
123
124 alarm.timestamp = timestamp;
103 true 125 true
104 } 126 }
105 }) 127 })
@@ -108,14 +130,14 @@ impl Driver for MockDriver {
108 130
109struct InnerMockDriver { 131struct InnerMockDriver {
110 now: Instant, 132 now: Instant,
111 alarm: AlarmState, 133 alarm: Option<AlarmState>,
112} 134}
113 135
114impl InnerMockDriver { 136impl InnerMockDriver {
115 const fn new() -> Self { 137 const fn new() -> Self {
116 Self { 138 Self {
117 now: Instant::from_ticks(0), 139 now: Instant::from_ticks(0),
118 alarm: AlarmState::new(), 140 alarm: None,
119 } 141 }
120 } 142 }
121} 143}