aboutsummaryrefslogtreecommitdiff
path: root/macros/src/codegen
diff options
context:
space:
mode:
Diffstat (limited to 'macros/src/codegen')
-rw-r--r--macros/src/codegen/dispatchers.rs8
-rw-r--r--macros/src/codegen/local_resources_struct.rs4
-rw-r--r--macros/src/codegen/module.rs42
-rw-r--r--macros/src/codegen/post_init.rs12
-rw-r--r--macros/src/codegen/pre_init.rs2
-rw-r--r--macros/src/codegen/shared_resources.rs2
-rw-r--r--macros/src/codegen/shared_resources_struct.rs4
-rw-r--r--macros/src/codegen/timer_queue.rs8
8 files changed, 40 insertions, 42 deletions
diff --git a/macros/src/codegen/dispatchers.rs b/macros/src/codegen/dispatchers.rs
index 57103acd..a90a97c7 100644
--- a/macros/src/codegen/dispatchers.rs
+++ b/macros/src/codegen/dispatchers.rs
@@ -78,12 +78,12 @@ pub fn codegen(app: &App, analysis: &Analysis, _extra: &Extra) -> Vec<TokenStrea
#(#cfgs)*
#t::#name => {
let #tupled =
- #inputs
- .get_unchecked()
+ (&*#inputs
+ .get())
.get_unchecked(usize::from(index))
.as_ptr()
.read();
- #fq.get_mut_unchecked().split().0.enqueue_unchecked(index);
+ (&mut *#fq.get_mut()).split().0.enqueue_unchecked(index);
let priority = &rtic::export::Priority::new(PRIORITY);
#name(
#name::Context::new(priority)
@@ -95,7 +95,7 @@ pub fn codegen(app: &App, analysis: &Analysis, _extra: &Extra) -> Vec<TokenStrea
.collect::<Vec<_>>();
stmts.push(quote!(
- while let Some((task, index)) = #rq.get_mut_unchecked().split().1.dequeue() {
+ while let Some((task, index)) = (&mut *#rq.get_mut()).split().1.dequeue() {
match task {
#(#arms)*
}
diff --git a/macros/src/codegen/local_resources_struct.rs b/macros/src/codegen/local_resources_struct.rs
index cdbfccca..10bde5fe 100644
--- a/macros/src/codegen/local_resources_struct.rs
+++ b/macros/src/codegen/local_resources_struct.rs
@@ -57,9 +57,9 @@ pub fn codegen(ctxt: Context, needs_lt: &mut bool, app: &App) -> (TokenStream2,
let expr = if is_declared {
// If the local resources is already initialized, we only need to access its value and
// not go through an `MaybeUninit`
- quote!(#mangled_name.get_mut_unchecked())
+ quote!(&mut *#mangled_name.get_mut())
} else {
- quote!(&mut *#mangled_name.get_mut_unchecked().as_mut_ptr())
+ quote!(&mut *(&mut *#mangled_name.get_mut()).as_mut_ptr())
};
values.push(quote!(
diff --git a/macros/src/codegen/module.rs b/macros/src/codegen/module.rs
index 5e0827ca..c59a814c 100644
--- a/macros/src/codegen/module.rs
+++ b/macros/src/codegen/module.rs
@@ -232,15 +232,15 @@ pub fn codegen(
let input = #tupled;
unsafe {
- if let Some(index) = rtic::export::interrupt::free(|_| #fq.get_mut_unchecked().dequeue()) {
- #inputs
- .get_mut_unchecked()
+ if let Some(index) = rtic::export::interrupt::free(|_| (&mut *#fq.get_mut()).dequeue()) {
+ (&mut *#inputs
+ .get_mut())
.get_unchecked_mut(usize::from(index))
.as_mut_ptr()
.write(input);
rtic::export::interrupt::free(|_| {
- #rq.get_mut_unchecked().enqueue_unchecked((#t::#name, index));
+ (&mut *#rq.get_mut()).enqueue_unchecked((#t::#name, index));
});
rtic::pend(#device::#enum_::#interrupt);
@@ -330,16 +330,16 @@ pub fn codegen(
impl #internal_spawn_handle_ident {
pub fn cancel(self) -> Result<#ty, ()> {
rtic::export::interrupt::free(|_| unsafe {
- let tq = #tq.get_mut_unchecked();
+ let tq = &mut *#tq.get_mut();
if let Some((_task, index)) = tq.cancel_marker(self.marker) {
// Get the message
- let msg = #inputs
- .get_unchecked()
+ let msg = (&*#inputs
+ .get())
.get_unchecked(usize::from(index))
.as_ptr()
.read();
// Return the index to the free queue
- #fq.get_mut_unchecked().split().0.enqueue_unchecked(index);
+ (&mut *#fq.get_mut()).split().0.enqueue_unchecked(index);
Ok(msg)
} else {
@@ -359,10 +359,10 @@ pub fn codegen(
pub fn reschedule_at(self, instant: rtic::time::Instant<#mono_type>) -> Result<Self, ()>
{
rtic::export::interrupt::free(|_| unsafe {
- let marker = *#tq_marker.get_mut_unchecked();
- *#tq_marker.get_mut_unchecked() = #tq_marker.get_mut_unchecked().wrapping_add(1);
+ let marker = #tq_marker.get().read();
+ #tq_marker.get_mut().write(marker.wrapping_add(1));
- let tq = #tq.get_mut_unchecked();
+ let tq = (&mut *#tq.get_mut());
tq.update_marker(self.marker, marker, instant, || #pend).map(|_| #name::#m::SpawnHandle { marker })
})
@@ -383,7 +383,7 @@ pub fn codegen(
D::T: Into<<#mono_type as rtic::time::Clock>::T>,
{
- let instant = if rtic::export::interrupt::free(|_| unsafe { #m_ident.get_mut_unchecked().is_none() }) {
+ let instant = if rtic::export::interrupt::free(|_| unsafe { (&*#m_ident.get()).is_none() }) {
rtic::time::Instant::new(0)
} else {
monotonics::#m::now()
@@ -401,21 +401,21 @@ pub fn codegen(
) -> Result<#name::#m::SpawnHandle, #ty> {
unsafe {
let input = #tupled;
- if let Some(index) = rtic::export::interrupt::free(|_| #fq.get_mut_unchecked().dequeue()) {
- #inputs
- .get_mut_unchecked()
+ if let Some(index) = rtic::export::interrupt::free(|_| (&mut *#fq.get_mut()).dequeue()) {
+ (&mut *#inputs
+ .get_mut())
.get_unchecked_mut(usize::from(index))
.as_mut_ptr()
.write(input);
- #instants
- .get_mut_unchecked()
+ (&mut *#instants
+ .get_mut())
.get_unchecked_mut(usize::from(index))
.as_mut_ptr()
.write(instant);
rtic::export::interrupt::free(|_| {
- let marker = *#tq_marker.get_mut_unchecked();
+ let marker = #tq_marker.get().read();
let nr = rtic::export::NotReady {
instant,
index,
@@ -423,15 +423,15 @@ pub fn codegen(
marker,
};
- *#tq_marker.get_mut_unchecked() = #tq_marker.get_mut_unchecked().wrapping_add(1);
+ #tq_marker.get_mut().write(#tq_marker.get().read().wrapping_add(1));
- let tq = #tq.get_mut_unchecked();
+ let tq = &mut *#tq.get_mut();
tq.enqueue_unchecked(
nr,
|| #enable_interrupt,
|| #pend,
- #m_ident.get_mut_unchecked().as_mut());
+ (&mut *#m_ident.get_mut()).as_mut());
Ok(#name::#m::SpawnHandle { marker })
})
diff --git a/macros/src/codegen/post_init.rs b/macros/src/codegen/post_init.rs
index 5624b20a..b3359ab4 100644
--- a/macros/src/codegen/post_init.rs
+++ b/macros/src/codegen/post_init.rs
@@ -19,10 +19,9 @@ pub fn codegen(app: &App, analysis: &Analysis) -> Vec<TokenStream2> {
// We include the cfgs
#(#cfgs)*
// Resource is a RacyCell<MaybeUninit<T>>
- // - `get_mut_unchecked` to obtain `MaybeUninit<T>`
- // - `as_mut_ptr` to obtain a raw pointer to `MaybeUninit<T>`
+ // - `get_mut` to obtain a raw pointer to `MaybeUninit<T>`
// - `write` the defined value for the late resource T
- #mangled_name.get_mut_unchecked().as_mut_ptr().write(shared_resources.#name);
+ (&mut *#mangled_name.get_mut()).as_mut_ptr().write(shared_resources.#name);
));
}
}
@@ -37,10 +36,9 @@ pub fn codegen(app: &App, analysis: &Analysis) -> Vec<TokenStream2> {
// We include the cfgs
#(#cfgs)*
// Resource is a RacyCell<MaybeUninit<T>>
- // - `get_mut_unchecked` to obtain `MaybeUninit<T>`
- // - `as_mut_ptr` to obtain a raw pointer to `MaybeUninit<T>`
+ // - `get_mut` to obtain a raw pointer to `MaybeUninit<T>`
// - `write` the defined value for the late resource T
- #mangled_name.get_mut_unchecked().as_mut_ptr().write(local_resources.#name);
+ (&mut *#mangled_name.get_mut()).as_mut_ptr().write(local_resources.#name);
));
}
}
@@ -58,7 +56,7 @@ pub fn codegen(app: &App, analysis: &Analysis) -> Vec<TokenStream2> {
// Store the monotonic
let name = util::monotonic_ident(&monotonic.to_string());
- stmts.push(quote!(*#name.get_mut_unchecked() = Some(monotonics.#idx);));
+ stmts.push(quote!(#name.get_mut().write(Some(monotonics.#idx));));
}
// Enable the interrupts -- this completes the `init`-ialization phase
diff --git a/macros/src/codegen/pre_init.rs b/macros/src/codegen/pre_init.rs
index 3017c08e..42cc0552 100644
--- a/macros/src/codegen/pre_init.rs
+++ b/macros/src/codegen/pre_init.rs
@@ -19,7 +19,7 @@ pub fn codegen(app: &App, analysis: &Analysis, extra: &Extra) -> Vec<TokenStream
let fq_ident = util::fq_ident(name);
stmts.push(quote!(
- (0..#cap).for_each(|i| #fq_ident.get_mut_unchecked().enqueue_unchecked(i));
+ (0..#cap).for_each(|i| (&mut *#fq_ident.get_mut()).enqueue_unchecked(i));
));
}
diff --git a/macros/src/codegen/shared_resources.rs b/macros/src/codegen/shared_resources.rs
index 07f8c36a..aa50dccb 100644
--- a/macros/src/codegen/shared_resources.rs
+++ b/macros/src/codegen/shared_resources.rs
@@ -69,7 +69,7 @@ pub fn codegen(
let ptr = quote!(
#(#cfgs)*
- #mangled_name.get_mut_unchecked().as_mut_ptr()
+ (&mut *#mangled_name.get_mut()).as_mut_ptr()
);
let ceiling = match analysis.ownerships.get(name) {
diff --git a/macros/src/codegen/shared_resources_struct.rs b/macros/src/codegen/shared_resources_struct.rs
index 5a805412..9983aa4c 100644
--- a/macros/src/codegen/shared_resources_struct.rs
+++ b/macros/src/codegen/shared_resources_struct.rs
@@ -75,9 +75,9 @@ pub fn codegen(ctxt: Context, needs_lt: &mut bool, app: &App) -> (TokenStream2,
}
let expr = if access.is_exclusive() {
- quote!(&mut *#mangled_name.get_mut_unchecked().as_mut_ptr())
+ quote!(&mut *(&mut *#mangled_name.get_mut()).as_mut_ptr())
} else {
- quote!(&*#mangled_name.get_unchecked().as_ptr())
+ quote!(&*(&*#mangled_name.get()).as_ptr())
};
values.push(quote!(
diff --git a/macros/src/codegen/timer_queue.rs b/macros/src/codegen/timer_queue.rs
index 896b3a83..2a344d25 100644
--- a/macros/src/codegen/timer_queue.rs
+++ b/macros/src/codegen/timer_queue.rs
@@ -117,7 +117,7 @@ pub fn codegen(app: &App, analysis: &Analysis, _extra: &Extra) -> Vec<TokenStrea
quote!(
#(#cfgs)*
#t::#name => {
- rtic::export::interrupt::free(|_| #rq.get_mut_unchecked().split().0.enqueue_unchecked((#rqt::#name, index)));
+ rtic::export::interrupt::free(|_| (&mut *#rq.get_mut()).split().0.enqueue_unchecked((#rqt::#name, index)));
#pend
}
@@ -137,8 +137,8 @@ pub fn codegen(app: &App, analysis: &Analysis, _extra: &Extra) -> Vec<TokenStrea
#[allow(non_snake_case)]
unsafe fn #bound_interrupt() {
while let Some((task, index)) = rtic::export::interrupt::free(|_|
- if let Some(mono) = #m_ident.get_mut_unchecked().as_mut() {
- #tq.get_mut_unchecked().dequeue(|| #disable_isr, mono)
+ if let Some(mono) = (&mut *#m_ident.get_mut()).as_mut() {
+ (&mut *#tq.get_mut()).dequeue(|| #disable_isr, mono)
} else {
// We can only use the timer queue if `init` has returned, and it
// writes the `Some(monotonic)` we are accessing here.
@@ -150,7 +150,7 @@ pub fn codegen(app: &App, analysis: &Analysis, _extra: &Extra) -> Vec<TokenStrea
}
}
- rtic::export::interrupt::free(|_| if let Some(mono) = #m_ident.get_mut_unchecked().as_mut() {
+ rtic::export::interrupt::free(|_| if let Some(mono) = (&mut *#m_ident.get_mut()).as_mut() {
mono.on_interrupt();
});
}