diff options
Diffstat (limited to 'macros/src')
-rw-r--r-- | macros/src/codegen/hardware_tasks.rs | 9 | ||||
-rw-r--r-- | macros/src/codegen/idle.rs | 3 | ||||
-rw-r--r-- | macros/src/codegen/init.rs | 3 | ||||
-rw-r--r-- | macros/src/codegen/resources.rs | 12 | ||||
-rw-r--r-- | macros/src/codegen/resources_struct.rs | 128 | ||||
-rw-r--r-- | macros/src/codegen/software_tasks.rs | 9 |
6 files changed, 61 insertions, 103 deletions
diff --git a/macros/src/codegen/hardware_tasks.rs b/macros/src/codegen/hardware_tasks.rs index e6fa5ed1..bc2e1203 100644 --- a/macros/src/codegen/hardware_tasks.rs +++ b/macros/src/codegen/hardware_tasks.rs @@ -70,13 +70,8 @@ pub fn codegen( // `${task}Resources` if !task.args.resources.is_empty() { - let (item, constructor) = resources_struct::codegen( - Context::HardwareTask(name), - priority, - &mut needs_lt, - app, - analysis, - ); + let (item, constructor) = + resources_struct::codegen(Context::HardwareTask(name), &mut needs_lt, app); root.push(item); diff --git a/macros/src/codegen/idle.rs b/macros/src/codegen/idle.rs index 36c69471..c8c8955d 100644 --- a/macros/src/codegen/idle.rs +++ b/macros/src/codegen/idle.rs @@ -37,8 +37,7 @@ pub fn codegen( let name = &idle.name; if !idle.args.resources.is_empty() { - let (item, constructor) = - resources_struct::codegen(Context::Idle, 0, &mut needs_lt, app, analysis); + let (item, constructor) = resources_struct::codegen(Context::Idle, &mut needs_lt, app); root_idle.push(item); mod_app = Some(constructor); diff --git a/macros/src/codegen/init.rs b/macros/src/codegen/init.rs index 0bb9b987..6376ce31 100644 --- a/macros/src/codegen/init.rs +++ b/macros/src/codegen/init.rs @@ -82,8 +82,7 @@ pub fn codegen(app: &App, analysis: &Analysis, extra: &Extra) -> CodegenResult { let mut mod_app = None; if !init.args.resources.is_empty() { - let (item, constructor) = - resources_struct::codegen(Context::Init, 0, &mut needs_lt, app, analysis); + let (item, constructor) = resources_struct::codegen(Context::Init, &mut needs_lt, app); root_init.push(item); mod_app = Some(constructor); diff --git a/macros/src/codegen/resources.rs b/macros/src/codegen/resources.rs index 0db4f728..76871e59 100644 --- a/macros/src/codegen/resources.rs +++ b/macros/src/codegen/resources.rs @@ -49,7 +49,8 @@ pub fn codegen( )); } - if let Some(Ownership::Contended { ceiling }) = analysis.ownerships.get(name) { + let r_prop = &res.properties; + if !r_prop.task_local && !r_prop.lock_free { mod_resources.push(quote!( #[allow(non_camel_case_types)] #(#cfgs)* @@ -83,13 +84,20 @@ pub fn codegen( ) }; + let ceiling = match analysis.ownerships.get(name) { + Some(Ownership::Owned { priority }) => *priority, + Some(Ownership::CoOwned { priority }) => *priority, + Some(Ownership::Contended { ceiling }) => *ceiling, + None => 0, + }; + mod_app.push(util::impl_mutex( extra, cfgs, true, name, quote!(#ty), - *ceiling, + ceiling, ptr, )); } diff --git a/macros/src/codegen/resources_struct.rs b/macros/src/codegen/resources_struct.rs index ffc72757..bffe9431 100644 --- a/macros/src/codegen/resources_struct.rs +++ b/macros/src/codegen/resources_struct.rs @@ -2,15 +2,9 @@ use proc_macro2::TokenStream as TokenStream2; use quote::quote; use rtic_syntax::{ast::App, Context}; -use crate::{analyze::Analysis, codegen::util}; - -pub fn codegen( - ctxt: Context, - priority: u8, - needs_lt: &mut bool, - app: &App, - analysis: &Analysis, -) -> (TokenStream2, TokenStream2) { +use crate::codegen::util; + +pub fn codegen(ctxt: Context, needs_lt: &mut bool, app: &App) -> (TokenStream2, TokenStream2) { let mut lt = None; let resources = match ctxt { @@ -30,6 +24,7 @@ pub fn codegen( let cfgs = &res.cfgs; has_cfgs |= !cfgs.is_empty(); + // access hold if the resource is [x] (exclusive) or [&x] (shared) let mut_ = if access.is_exclusive() { Some(quote!(mut)) } else { @@ -38,99 +33,66 @@ pub fn codegen( let ty = &res.ty; let mangled_name = util::mangle_ident(&name); - if ctxt.is_init() { - if !analysis.ownerships.contains_key(name) { - // Owned by `init` - fields.push(quote!( - #(#cfgs)* - pub #name: &'static #mut_ #ty - )); + // let ownership = &analysis.ownerships[name]; + let r_prop = &res.properties; - values.push(quote!( + if !r_prop.task_local && !r_prop.lock_free { + if access.is_shared() { + lt = Some(quote!('a)); + + fields.push(quote!( #(#cfgs)* - #name: &#mut_ #mangled_name + pub #name: &'a #ty )); } else { - // Owned by someone else + // Resource proxy lt = Some(quote!('a)); fields.push(quote!( #(#cfgs)* - pub #name: &'a mut #ty + pub #name: resources::#name<'a> )); values.push(quote!( #(#cfgs)* - #name: &mut #mangled_name + #name: resources::#name::new(priority) + )); + + // continue as the value has been filled, + continue; } } else { - let ownership = &analysis.ownerships[name]; - - if ownership.needs_lock(priority) { - if mut_.is_none() { - lt = Some(quote!('a)); - - fields.push(quote!( - #(#cfgs)* - pub #name: &'a #ty - )); - } else { - // Resource proxy - lt = Some(quote!('a)); - - fields.push(quote!( - #(#cfgs)* - pub #name: resources::#name<'a> - )); - - values.push(quote!( - #(#cfgs)* - #name: resources::#name::new(priority) - - )); - - continue; - } + let lt = if ctxt.runs_once() { + quote!('static) } else { - let lt = if ctxt.runs_once() { - quote!('static) - } else { - lt = Some(quote!('a)); - quote!('a) - }; - - if ownership.is_owned() || mut_.is_none() { - fields.push(quote!( - #(#cfgs)* - pub #name: &#lt #mut_ #ty - )); - } else { - fields.push(quote!( - #(#cfgs)* - pub #name: &#lt mut #ty - )); - } - } + lt = Some(quote!('a)); + quote!('a) + }; - let is_late = expr.is_none(); - if is_late { - let expr = if mut_.is_some() { - quote!(&mut *#mangled_name.as_mut_ptr()) - } else { - quote!(&*#mangled_name.as_ptr()) - }; + fields.push(quote!( + #(#cfgs)* + pub #name: &#lt #mut_ #ty + )); + } - values.push(quote!( - #(#cfgs)* - #name: #expr - )); + let is_late = expr.is_none(); + if is_late { + let expr = if access.is_exclusive() { + quote!(&mut *#mangled_name.as_mut_ptr()) } else { - values.push(quote!( - #(#cfgs)* - #name: &#mut_ #mangled_name - )); - } + quote!(&*#mangled_name.as_ptr()) + }; + + values.push(quote!( + #(#cfgs)* + #name: #expr + )); + } else { + values.push(quote!( + #(#cfgs)* + #name: &#mut_ #mangled_name + )); } } diff --git a/macros/src/codegen/software_tasks.rs b/macros/src/codegen/software_tasks.rs index 18cecdf2..7cccd8c4 100644 --- a/macros/src/codegen/software_tasks.rs +++ b/macros/src/codegen/software_tasks.rs @@ -82,13 +82,8 @@ pub fn codegen( // `${task}Resources` let mut needs_lt = false; if !task.args.resources.is_empty() { - let (item, constructor) = resources_struct::codegen( - Context::SoftwareTask(name), - task.args.priority, - &mut needs_lt, - app, - analysis, - ); + let (item, constructor) = + resources_struct::codegen(Context::SoftwareTask(name), &mut needs_lt, app); root.push(item); |