diff --git a/macros/src/codegen/shared_resources.rs b/macros/src/codegen/shared_resources.rs index 3ac7a5c0bb..8c0a542a8a 100644 --- a/macros/src/codegen/shared_resources.rs +++ b/macros/src/codegen/shared_resources.rs @@ -110,34 +110,6 @@ pub fn codegen( let to_gen = quote! { - pub struct __rtic_internal_fooShared { - a: &'static mut u32, - b: &'static mut i64, - } - - - impl __rtic_internal_fooShared { - #[inline(always)] - pub unsafe fn new() -> Self { - __rtic_internal_fooShared { - a: &mut *__rtic_internal_shared_resource_a - .get_mut_unchecked() - .as_mut_ptr(), - b: &mut *__rtic_internal_shared_resource_b - .get_mut_unchecked() - .as_mut_ptr(), - } - } - } - - // #[doc = #manual] - // impl<'a> __rtic_internal_fooSharedResources<'a> { - // #[inline(always)] - // pub unsafe fn priority(&self) -> &rtic::export::Priority { - // self.priority - // } - // } - #[doc = #manual] impl<'a> rtic::Mutex for __rtic_internal_fooSharedResources<'a> { type T = __rtic_internal_fooShared; diff --git a/macros/src/codegen/shared_resources_struct.rs b/macros/src/codegen/shared_resources_struct.rs index 44ef19d710..497a8455ea 100644 --- a/macros/src/codegen/shared_resources_struct.rs +++ b/macros/src/codegen/shared_resources_struct.rs @@ -19,6 +19,10 @@ pub fn codegen(ctxt: Context, needs_lt: &mut bool, app: &App) -> (TokenStream2, let mut values = vec![]; let mut has_cfgs = false; + // Lock-all api related + let mut fields_mut = vec![]; + let mut values_mut = vec![]; + for (name, access) in resources { let res = app.shared_resources.get(name).expect("UNREACHABLE"); @@ -37,6 +41,7 @@ pub fn codegen(ctxt: Context, needs_lt: &mut bool, app: &App) -> (TokenStream2, if !res.properties.lock_free { if access.is_shared() { + // [&x] (shared) lt = Some(quote!('a)); fields.push(quote!( @@ -58,6 +63,18 @@ pub fn codegen(ctxt: Context, needs_lt: &mut bool, app: &App) -> (TokenStream2, )); + // Lock-all related + fields_mut.push(quote!( + #(#cfgs)* + pub #name: &'static mut #ty + )); + + values_mut.push(quote!( + #(#cfgs)* + #name: &mut *(&mut *#mangled_name.get_mut()).as_mut_ptr() + + )); + // continue as the value has been filled, continue; } @@ -103,6 +120,14 @@ pub fn codegen(ctxt: Context, needs_lt: &mut bool, app: &App) -> (TokenStream2, let doc = format!("Shared resources `{}` has access to", ctxt.ident(app)); let ident = util::shared_resources_ident(ctxt, app); + + // Lock-all related + let doc_mut = format!( + "Shared resources `{}` has lock all access to", + ctxt.ident(app) + ); + let ident_mut = util::shared_resources_ident_mut(ctxt, app); + let item = quote!( #[allow(non_snake_case)] #[allow(non_camel_case_types)] @@ -112,11 +137,12 @@ pub fn codegen(ctxt: Context, needs_lt: &mut bool, app: &App) -> (TokenStream2, priority: &'a rtic::export::Priority, } - impl<#lt>#ident<#lt> { - #[inline(always)] - pub unsafe fn priority(&self) -> &rtic::export::Priority { - self.priority - } + // Used by the lock-all API + #[allow(non_snake_case)] + #[allow(non_camel_case_types)] + #[doc = #doc_mut] + pub struct #ident_mut { + #(#fields_mut,)* } ); @@ -125,7 +151,7 @@ pub fn codegen(ctxt: Context, needs_lt: &mut bool, app: &App) -> (TokenStream2, } else { Some(quote!(priority: &#lt rtic::export::Priority)) }; - let constructor = quote!( + let implementations = quote!( impl<#lt> #ident<#lt> { #[inline(always)] pub unsafe fn new(#arg) -> Self { @@ -134,8 +160,23 @@ pub fn codegen(ctxt: Context, needs_lt: &mut bool, app: &App) -> (TokenStream2, priority } } + + #[inline(always)] + pub unsafe fn priority(&self) -> &rtic::export::Priority { + self.priority + } + } + + // Used by the lock-all API + impl #ident_mut { + #[inline(always)] + pub unsafe fn new() -> Self { + #ident_mut { + #(#values_mut,)* + } + } } ); - (item, constructor) + (item, implementations) } diff --git a/macros/src/codegen/util.rs b/macros/src/codegen/util.rs index e865434528..5cdb5753cf 100644 --- a/macros/src/codegen/util.rs +++ b/macros/src/codegen/util.rs @@ -202,6 +202,19 @@ pub fn shared_resources_ident(ctxt: Context, app: &App) -> Ident { mark_internal_name(&s) } +/// Generates a pre-reexport identifier for the "shared resources" struct +pub fn shared_resources_ident_mut(ctxt: Context, app: &App) -> Ident { + let mut s = match ctxt { + Context::Init => app.init.name.to_string(), + Context::Idle => app.idle.as_ref().unwrap().name.to_string(), + Context::HardwareTask(ident) | Context::SoftwareTask(ident) => ident.to_string(), + }; + + s.push_str("Shared"); + + mark_internal_name(&s) +} + /// Generates a pre-reexport identifier for the "local resources" struct pub fn local_resources_ident(ctxt: Context, app: &App) -> Ident { let mut s = match ctxt {