diff options
Diffstat (limited to 'macros/src/codegen/shared_resources_struct.rs')
-rw-r--r-- | macros/src/codegen/shared_resources_struct.rs | 55 |
1 files changed, 48 insertions, 7 deletions
diff --git a/macros/src/codegen/shared_resources_struct.rs b/macros/src/codegen/shared_resources_struct.rs index 05e222e4..ece5ff97 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"); @@ -36,6 +40,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!( @@ -57,6 +62,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 *#mangled_name.get_mut_unchecked().as_mut_ptr() + + )); + // continue as the value has been filled, continue; } @@ -102,6 +119,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)] @@ -111,11 +136,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,)* } ); @@ -124,7 +150,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 { @@ -133,8 +159,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) } |