mirror of
https://github.com/rtic-rs/rtic.git
synced 2024-11-29 06:54:33 +01:00
Fix error based on retry queue
This commit is contained in:
parent
07bd57a20f
commit
4a349653b4
3 changed files with 12 additions and 10 deletions
|
@ -1,6 +1,5 @@
|
|||
//! examples/ramfunc.rs
|
||||
|
||||
#![deny(unsafe_code)]
|
||||
#![deny(warnings)]
|
||||
#![no_main]
|
||||
#![no_std]
|
||||
|
|
|
@ -137,11 +137,12 @@ pub fn codegen(app: &App, analysis: &Analysis, extra: &Extra) -> Vec<TokenStream
|
|||
}
|
||||
}
|
||||
|
||||
let n_executors: usize = app
|
||||
let n_executors = app
|
||||
.software_tasks
|
||||
.iter()
|
||||
.map(|(_, task)| if task.is_async { 1 } else { 0 })
|
||||
.sum();
|
||||
.sum::<usize>()
|
||||
.max(1);
|
||||
|
||||
// TODO: This `retry_queue` comes from the current design of the dispatcher queue handling.
|
||||
// To remove this we would need to redesign how the dispatcher handles queues, and this can
|
||||
|
@ -152,11 +153,9 @@ pub fn codegen(app: &App, analysis: &Analysis, extra: &Extra) -> Vec<TokenStream
|
|||
// `while let Some(...) = (&mut *#rq.get_mut())...` a few lines down. The current "hack" is
|
||||
// to just requeue the executor run if it should not have been dequeued. This needs however
|
||||
// to be done after the ready queue has been exhausted.
|
||||
if n_executors > 0 {
|
||||
stmts.push(quote!(
|
||||
let mut retry_queue: rtic::export::Vec<_, #n_executors> = rtic::export::Vec::new();
|
||||
));
|
||||
}
|
||||
|
||||
stmts.push(quote!(
|
||||
while let Some((task, index)) = (&mut *#rq.get_mut()).split().1.dequeue() {
|
||||
|
|
|
@ -162,7 +162,9 @@ where
|
|||
let now = mono.now();
|
||||
if instant <= now {
|
||||
// Task became ready, wake the waker
|
||||
self.waker_queue.pop().map(|v| v.val.waker.wake_by_ref());
|
||||
if let Some(v) = self.waker_queue.pop() {
|
||||
v.val.waker.wake_by_ref()
|
||||
}
|
||||
} else {
|
||||
// Set compare
|
||||
mono.set_compare(instant);
|
||||
|
@ -172,7 +174,9 @@ where
|
|||
// read of now to the set of the compare, the time can overflow. This is to
|
||||
// guard against this.
|
||||
if instant <= now {
|
||||
self.waker_queue.pop().map(|v| v.val.waker.wake_by_ref());
|
||||
if let Some(v) = self.waker_queue.pop() {
|
||||
v.val.waker.wake_by_ref()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue