aboutsummaryrefslogtreecommitdiff
path: root/macros/src/codegen/shared_resources_struct.rs
diff options
context:
space:
mode:
authorGravatar bors[bot] <26634292+bors[bot]@users.noreply.github.com> 2021-07-09 11:00:11 +0000
committerGravatar GitHub <noreply@github.com> 2021-07-09 11:00:11 +0000
commite1a4d001f8e724596cd9de3e90698ce7de473b3f (patch)
treef7aac5eae4cc2e19cc06bfd6fa8dab843dcfb276 /macros/src/codegen/shared_resources_struct.rs
parent13dc3992e616d817e38c167c4b47db816855f18b (diff)
parentf3d9fd9b638a25b497e1ca02e7ce5de86c9fc1c9 (diff)
downloadrtic-e1a4d001f8e724596cd9de3e90698ce7de473b3f.tar.gz
rtic-e1a4d001f8e724596cd9de3e90698ce7de473b3f.tar.zst
rtic-e1a4d001f8e724596cd9de3e90698ce7de473b3f.zip
Merge #494
494: Resoures take 2 r=korken89 a=korken89 Co-authored-by: Emil Fresk <emil.fresk@gmail.com>
Diffstat (limited to '')
-rw-r--r--macros/src/codegen/shared_resources_struct.rs (renamed from macros/src/codegen/resources_struct.rs)52
1 files changed, 21 insertions, 31 deletions
diff --git a/macros/src/codegen/resources_struct.rs b/macros/src/codegen/shared_resources_struct.rs
index 6fe4678a..301bef73 100644
--- a/macros/src/codegen/resources_struct.rs
+++ b/macros/src/codegen/shared_resources_struct.rs
@@ -4,14 +4,15 @@ use rtic_syntax::{ast::App, Context};
use crate::codegen::util;
+/// Generate shared resources structs
pub fn codegen(ctxt: Context, needs_lt: &mut bool, app: &App) -> (TokenStream2, TokenStream2) {
let mut lt = None;
let resources = match ctxt {
- Context::Init => &app.inits.first().unwrap().args.resources,
- Context::Idle => &app.idles.first().unwrap().args.resources,
- Context::HardwareTask(name) => &app.hardware_tasks[name].args.resources,
- Context::SoftwareTask(name) => &app.software_tasks[name].args.resources,
+ Context::Init => unreachable!("Tried to generate shared resources struct for init"),
+ Context::Idle => &app.idle.as_ref().unwrap().args.shared_resources,
+ Context::HardwareTask(name) => &app.hardware_tasks[name].args.shared_resources,
+ Context::SoftwareTask(name) => &app.software_tasks[name].args.shared_resources,
};
let mut fields = vec![];
@@ -19,7 +20,7 @@ pub fn codegen(ctxt: Context, needs_lt: &mut bool, app: &App) -> (TokenStream2,
let mut has_cfgs = false;
for (name, access) in resources {
- let (res, expr) = app.resource(name).expect("UNREACHABLE");
+ let res = app.shared_resources.get(name).expect("UNREACHABLE");
let cfgs = &res.cfgs;
has_cfgs |= !cfgs.is_empty();
@@ -31,12 +32,9 @@ pub fn codegen(ctxt: Context, needs_lt: &mut bool, app: &App) -> (TokenStream2,
None
};
let ty = &res.ty;
- let mangled_name = util::mark_internal_ident(&name);
+ let mangled_name = util::mark_internal_ident(&util::static_shared_resource_ident(&name));
- // let ownership = &analysis.ownerships[name];
- let r_prop = &res.properties;
-
- if !r_prop.task_local && !r_prop.lock_free {
+ if !res.properties.lock_free {
if access.is_shared() {
lt = Some(quote!('a));
@@ -50,12 +48,12 @@ pub fn codegen(ctxt: Context, needs_lt: &mut bool, app: &App) -> (TokenStream2,
fields.push(quote!(
#(#cfgs)*
- pub #name: resources::#name<'a>
+ pub #name: shared_resources::#name<'a>
));
values.push(quote!(
#(#cfgs)*
- #name: resources::#name::new(priority)
+ #name: shared_resources::#name::new(priority)
));
@@ -76,24 +74,16 @@ pub fn codegen(ctxt: Context, needs_lt: &mut bool, app: &App) -> (TokenStream2,
));
}
- let is_late = expr.is_none();
- if is_late {
- let expr = if access.is_exclusive() {
- quote!(&mut *#mangled_name.get_mut_unchecked().as_mut_ptr())
- } else {
- quote!(&*#mangled_name.get_unchecked().as_ptr())
- };
-
- values.push(quote!(
- #(#cfgs)*
- #name: #expr
- ));
+ let expr = if access.is_exclusive() {
+ quote!(&mut *#mangled_name.get_mut_unchecked().as_mut_ptr())
} else {
- values.push(quote!(
- #(#cfgs)*
- #name: #mangled_name.get_mut_unchecked()
- ));
- }
+ quote!(&*#mangled_name.get_unchecked().as_ptr())
+ };
+
+ values.push(quote!(
+ #(#cfgs)*
+ #name: #expr
+ ));
}
if lt.is_some() {
@@ -110,8 +100,8 @@ pub fn codegen(ctxt: Context, needs_lt: &mut bool, app: &App) -> (TokenStream2,
}
}
- let doc = format!("Resources `{}` has access to", ctxt.ident(app));
- let ident = util::resources_ident(ctxt, app);
+ let doc = format!("Shared resources `{}` has access to", ctxt.ident(app));
+ let ident = util::shared_resources_ident(ctxt, app);
let ident = util::mark_internal_ident(&ident);
let item = quote!(
#[allow(non_snake_case)]