Prevent over-allocation

This commit is contained in:
Chris Price 2024-01-09 12:02:58 +00:00
parent fdd7acd484
commit e4e2b31402

View File

@ -58,13 +58,17 @@ impl MockDriver {
inner.now = inner.now + duration; inner.now = inner.now + duration;
if inner.alarm.timestamp <= inner.now.as_ticks() { let now = inner.now.as_ticks();
inner.alarm.timestamp = u64::MAX;
Some((inner.alarm.callback, inner.alarm.ctx)) inner
} else { .alarm
None .as_mut()
} .filter(|alarm| alarm.timestamp <= now)
.map(|alarm| {
alarm.timestamp = u64::MAX;
(alarm.callback, alarm.ctx)
})
}) })
}; };
@ -80,15 +84,29 @@ impl Driver for MockDriver {
} }
unsafe fn allocate_alarm(&self) -> Option<AlarmHandle> { unsafe fn allocate_alarm(&self) -> Option<AlarmHandle> {
critical_section::with(|cs| {
let mut inner = self.0.borrow_ref_mut(cs);
if inner.alarm.is_some() {
None
} else {
inner.alarm.replace(AlarmState::new());
Some(AlarmHandle::new(0)) Some(AlarmHandle::new(0))
} }
})
}
fn set_alarm_callback(&self, _alarm: AlarmHandle, callback: fn(*mut ()), ctx: *mut ()) { fn set_alarm_callback(&self, _alarm: AlarmHandle, callback: fn(*mut ()), ctx: *mut ()) {
critical_section::with(|cs| { critical_section::with(|cs| {
let mut inner = self.0.borrow_ref_mut(cs); let mut inner = self.0.borrow_ref_mut(cs);
inner.alarm.callback = callback; let Some(alarm) = inner.alarm.as_mut() else {
inner.alarm.ctx = ctx; panic!("Alarm not allocated");
};
alarm.callback = callback;
alarm.ctx = ctx;
}); });
} }
@ -99,7 +117,11 @@ impl Driver for MockDriver {
if timestamp <= inner.now.as_ticks() { if timestamp <= inner.now.as_ticks() {
false false
} else { } else {
inner.alarm.timestamp = timestamp; let Some(alarm) = inner.alarm.as_mut() else {
panic!("Alarm not allocated");
};
alarm.timestamp = timestamp;
true true
} }
}) })
@ -108,14 +130,14 @@ impl Driver for MockDriver {
struct InnerMockDriver { struct InnerMockDriver {
now: Instant, now: Instant,
alarm: AlarmState, alarm: Option<AlarmState>,
} }
impl InnerMockDriver { impl InnerMockDriver {
const fn new() -> Self { const fn new() -> Self {
Self { Self {
now: Instant::from_ticks(0), now: Instant::from_ticks(0),
alarm: AlarmState::new(), alarm: None,
} }
} }
} }