aboutsummaryrefslogtreecommitdiff
path: root/macros/src/codegen/shared_resources_struct.rs
diff options
context:
space:
mode:
Diffstat (limited to 'macros/src/codegen/shared_resources_struct.rs')
-rw-r--r--macros/src/codegen/shared_resources_struct.rs55
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)
}