diff options
Diffstat (limited to 'macros/src/codegen')
-rw-r--r-- | macros/src/codegen/dispatchers.rs | 8 | ||||
-rw-r--r-- | macros/src/codegen/local_resources_struct.rs | 4 | ||||
-rw-r--r-- | macros/src/codegen/module.rs | 42 | ||||
-rw-r--r-- | macros/src/codegen/post_init.rs | 12 | ||||
-rw-r--r-- | macros/src/codegen/pre_init.rs | 2 | ||||
-rw-r--r-- | macros/src/codegen/shared_resources.rs | 2 | ||||
-rw-r--r-- | macros/src/codegen/shared_resources_struct.rs | 4 | ||||
-rw-r--r-- | macros/src/codegen/timer_queue.rs | 8 |
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(); }); } |