aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Per Lindgren <per.lindgren@ltu.se> 2021-10-18 16:47:21 +0200
committerGravatar Per Lindgren <per.lindgren@ltu.se> 2021-11-03 10:07:10 +0100
commit05586401c79f277b64ec2ee5ccf23bee399c11be (patch)
tree9f6b50fc923b656d897eddb766dac914fb546223
parent4cefde75e8b2ccef4b96a37c84b1e313ba710bcf (diff)
downloadrtic-05586401c79f277b64ec2ee5ccf23bee399c11be.tar.gz
rtic-05586401c79f277b64ec2ee5ccf23bee399c11be.tar.zst
rtic-05586401c79f277b64ec2ee5ccf23bee399c11be.zip
api test (all but lock automated)
-rw-r--r--macros/src/codegen/shared_resources.rs28
-rw-r--r--macros/src/codegen/shared_resources_struct.rs55
-rw-r--r--macros/src/codegen/util.rs13
3 files changed, 61 insertions, 35 deletions
diff --git a/macros/src/codegen/shared_resources.rs b/macros/src/codegen/shared_resources.rs
index 62857526..87cd8f19 100644
--- a/macros/src/codegen/shared_resources.rs
+++ b/macros/src/codegen/shared_resources.rs
@@ -108,34 +108,6 @@ pub fn codegen(
let to_gen = quote! {
- pub struct __rtic_internal_fooShared {
- a: &'static mut u32,
- b: &'static mut i64,
- }
-
-
- impl __rtic_internal_fooShared {
- #[inline(always)]
- pub unsafe fn new() -> Self {
- __rtic_internal_fooShared {
- a: &mut *__rtic_internal_shared_resource_a
- .get_mut_unchecked()
- .as_mut_ptr(),
- b: &mut *__rtic_internal_shared_resource_b
- .get_mut_unchecked()
- .as_mut_ptr(),
- }
- }
- }
-
- // #[doc = #manual]
- // impl<'a> __rtic_internal_fooSharedResources<'a> {
- // #[inline(always)]
- // pub unsafe fn priority(&self) -> &rtic::export::Priority {
- // self.priority
- // }
- // }
-
#[doc = #manual]
impl<'a> rtic::Mutex for __rtic_internal_fooSharedResources<'a> {
type T = __rtic_internal_fooShared;
diff --git a/macros/src/codegen/shared_resources_struct.rs b/macros/src/codegen/shared_resources_struct.rs
index 05e222e4..ece5ff97 100644
--- a/macros/src/codegen/shared_resources_struct.rs
+++ b/macros/src/codegen/shared_resources_struct.rs
@@ -19,6 +19,10 @@ pub fn codegen(ctxt: Context, needs_lt: &mut bool, app: &App) -> (TokenStream2,
let mut values = vec![];
let mut has_cfgs = false;
+ // Lock-all api related
+ let mut fields_mut = vec![];
+ let mut values_mut = vec![];
+
for (name, access) in resources {
let res = app.shared_resources.get(name).expect("UNREACHABLE");
@@ -36,6 +40,7 @@ pub fn codegen(ctxt: Context, needs_lt: &mut bool, app: &App) -> (TokenStream2,
if !res.properties.lock_free {
if access.is_shared() {
+ // [&x] (shared)
lt = Some(quote!('a));
fields.push(quote!(
@@ -57,6 +62,18 @@ pub fn codegen(ctxt: Context, needs_lt: &mut bool, app: &App) -> (TokenStream2,
));
+ // Lock-all related
+ fields_mut.push(quote!(
+ #(#cfgs)*
+ pub #name: &'static mut #ty
+ ));
+
+ values_mut.push(quote!(
+ #(#cfgs)*
+ #name: &mut *#mangled_name.get_mut_unchecked().as_mut_ptr()
+
+ ));
+
// continue as the value has been filled,
continue;
}
@@ -102,6 +119,14 @@ pub fn codegen(ctxt: Context, needs_lt: &mut bool, app: &App) -> (TokenStream2,
let doc = format!("Shared resources `{}` has access to", ctxt.ident(app));
let ident = util::shared_resources_ident(ctxt, app);
+
+ // Lock-all related
+ let doc_mut = format!(
+ "Shared resources `{}` has lock all access to",
+ ctxt.ident(app)
+ );
+ let ident_mut = util::shared_resources_ident_mut(ctxt, app);
+
let item = quote!(
#[allow(non_snake_case)]
#[allow(non_camel_case_types)]
@@ -111,11 +136,12 @@ pub fn codegen(ctxt: Context, needs_lt: &mut bool, app: &App) -> (TokenStream2,
priority: &'a rtic::export::Priority,
}
- impl<#lt>#ident<#lt> {
- #[inline(always)]
- pub unsafe fn priority(&self) -> &rtic::export::Priority {
- self.priority
- }
+ // Used by the lock-all API
+ #[allow(non_snake_case)]
+ #[allow(non_camel_case_types)]
+ #[doc = #doc_mut]
+ pub struct #ident_mut {
+ #(#fields_mut,)*
}
);
@@ -124,7 +150,7 @@ pub fn codegen(ctxt: Context, needs_lt: &mut bool, app: &App) -> (TokenStream2,
} else {
Some(quote!(priority: &#lt rtic::export::Priority))
};
- let constructor = quote!(
+ let implementations = quote!(
impl<#lt> #ident<#lt> {
#[inline(always)]
pub unsafe fn new(#arg) -> Self {
@@ -133,8 +159,23 @@ pub fn codegen(ctxt: Context, needs_lt: &mut bool, app: &App) -> (TokenStream2,
priority
}
}
+
+ #[inline(always)]
+ pub unsafe fn priority(&self) -> &rtic::export::Priority {
+ self.priority
+ }
+ }
+
+ // Used by the lock-all API
+ impl #ident_mut {
+ #[inline(always)]
+ pub unsafe fn new() -> Self {
+ #ident_mut {
+ #(#values_mut,)*
+ }
+ }
}
);
- (item, constructor)
+ (item, implementations)
}
diff --git a/macros/src/codegen/util.rs b/macros/src/codegen/util.rs
index 8e40ad61..d16faf33 100644
--- a/macros/src/codegen/util.rs
+++ b/macros/src/codegen/util.rs
@@ -202,6 +202,19 @@ pub fn shared_resources_ident(ctxt: Context, app: &App) -> Ident {
mark_internal_name(&s)
}
+/// Generates a pre-reexport identifier for the "shared resources" struct
+pub fn shared_resources_ident_mut(ctxt: Context, app: &App) -> Ident {
+ let mut s = match ctxt {
+ Context::Init => app.init.name.to_string(),
+ Context::Idle => app.idle.as_ref().unwrap().name.to_string(),
+ Context::HardwareTask(ident) | Context::SoftwareTask(ident) => ident.to_string(),
+ };
+
+ s.push_str("Shared");
+
+ mark_internal_name(&s)
+}
+
/// Generates a pre-reexport identifier for the "local resources" struct
pub fn local_resources_ident(ctxt: Context, app: &App) -> Ident {
let mut s = match ctxt {