mirror of
https://github.com/rtic-rs/rtic.git
synced 2024-11-23 20:22:51 +01:00
wip Priority leakage
This commit is contained in:
parent
c4af4eb244
commit
2b70b1faf3
3 changed files with 33 additions and 26 deletions
|
@ -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,
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
|
@ -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(
|
(
|
||||||
extra,
|
util::impl_mutex(
|
||||||
&vec![], // TODO: what cfg should go here?
|
extra,
|
||||||
false, // resource proxy at top level (not in shared_resources)
|
&vec![], // TODO: what cfg should go here?
|
||||||
&ident,
|
quote!(#ident),
|
||||||
quote!(#ident_mut),
|
quote!(#ident_mut),
|
||||||
max_ceiling,
|
max_ceiling,
|
||||||
quote!(&mut #ident_mut::new()),
|
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!(
|
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
|
||||||
|
|
|
@ -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)*
|
||||||
|
|
Loading…
Reference in a new issue