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(
extra,
cfgs,
true,
&shared_name,
quote!(shared_resources::#shared_name),
quote!(#ty),
ceiling,
quote!(self.priority()),
ptr,
));
}

View file

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

View file

@ -23,18 +23,12 @@ pub fn fq_ident(task: &Ident) -> Ident {
pub fn impl_mutex(
extra: &Extra,
cfgs: &[Attribute],
resources_prefix: bool,
name: &Ident,
path: TokenStream2,
ty: TokenStream2,
ceiling: u8,
priority: TokenStream2,
ptr: 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;
quote!(
#(#cfgs)*