wip Priority leakage

This commit is contained in:
Per Lindgren 2021-10-20 09:30:42 +02:00 committed by Henrik Tjäder
parent c4af4eb244
commit 2b70b1faf3
3 changed files with 33 additions and 26 deletions

View file

@ -87,10 +87,10 @@ pub fn codegen(
mod_app.push(util::impl_mutex( mod_app.push(util::impl_mutex(
extra, extra,
cfgs, cfgs,
true, quote!(shared_resources::#shared_name),
&shared_name,
quote!(#ty), quote!(#ty),
ceiling, ceiling,
quote!(self.priority()),
ptr, ptr,
)); ));
} }

View file

@ -29,6 +29,7 @@ pub fn codegen(
let mut fields_mut = vec![]; let mut fields_mut = vec![];
let mut values_mut = vec![]; let mut values_mut = vec![];
let mut max_ceiling = 0; let mut max_ceiling = 0;
let mut field_get_prio = None;
for (name, access) in resources { for (name, access) in resources {
let res = app.shared_resources.get(name).expect("UNREACHABLE"); let res = app.shared_resources.get(name).expect("UNREACHABLE");
@ -64,6 +65,10 @@ pub fn codegen(
pub #name: shared_resources::#shared_name<'a> pub #name: shared_resources::#shared_name<'a>
)); ));
field_get_prio = Some(quote!(
#name
));
values.push(quote!( values.push(quote!(
#(#cfgs)* #(#cfgs)*
#name: shared_resources::#shared_name::new(priority) #name: shared_resources::#shared_name::new(priority)
@ -150,7 +155,6 @@ pub fn codegen(
#[doc = #doc] #[doc = #doc]
pub struct #ident<#lt> { pub struct #ident<#lt> {
#(#fields,)* #(#fields,)*
priority: &'a rtic::export::Priority,
} }
// Used by the lock-all API // Used by the lock-all API
@ -168,16 +172,29 @@ pub fn codegen(
Some(quote!(priority: &#lt rtic::export::Priority)) Some(quote!(priority: &#lt rtic::export::Priority))
}; };
// Generate code for the lock-all API let (lock_all, get_prio) = if let Some(name) = field_get_prio {
let lock_all = util::impl_mutex( (
util::impl_mutex(
extra, extra,
&vec![], // TODO: what cfg should go here? &vec![], // TODO: what cfg should go here?
false, // resource proxy at top level (not in shared_resources) quote!(#ident),
&ident,
quote!(#ident_mut), quote!(#ident_mut),
max_ceiling, max_ceiling,
quote!(self.priority()),
quote!(&mut #ident_mut::new()), quote!(&mut #ident_mut::new()),
); ),
quote!(
// Used by the lock-all API
#[inline(always)]
pub unsafe fn priority(&self) -> &rtic::export::Priority {
//panic!("here {:?}", self);
self.#name.priority()
}
),
)
} else {
(quote!(), quote!())
};
let implementations = quote!( let implementations = quote!(
impl<#lt> #ident<#lt> { impl<#lt> #ident<#lt> {
@ -185,14 +202,10 @@ pub fn codegen(
pub unsafe fn new(#arg) -> Self { pub unsafe fn new(#arg) -> Self {
#ident { #ident {
#(#values,)* #(#values,)*
priority
} }
} }
#[inline(always)] #get_prio
pub unsafe fn priority(&self) -> &rtic::export::Priority {
self.priority
}
} }
// Used by the lock-all API // Used by the lock-all API

View file

@ -23,18 +23,12 @@ pub fn fq_ident(task: &Ident) -> Ident {
pub fn impl_mutex( pub fn impl_mutex(
extra: &Extra, extra: &Extra,
cfgs: &[Attribute], cfgs: &[Attribute],
resources_prefix: bool, path: TokenStream2,
name: &Ident,
ty: TokenStream2, ty: TokenStream2,
ceiling: u8, ceiling: u8,
priority: TokenStream2,
ptr: TokenStream2, ptr: TokenStream2,
) -> TokenStream2 { ) -> TokenStream2 {
let (path, priority) = if resources_prefix {
(quote!(shared_resources::#name), quote!(self.priority()))
} else {
(quote!(#name), quote!(self.priority))
};
let device = &extra.device; let device = &extra.device;
quote!( quote!(
#(#cfgs)* #(#cfgs)*