diff options
author | 2020-10-11 18:38:38 +0200 | |
---|---|---|
committer | 2020-10-11 18:38:38 +0200 | |
commit | 524273c96a978299b64e51a9cdcc007585a0f170 (patch) | |
tree | 63e7f8bce84e1109e4814dbc7d48e837e5e60a6d /macros/src/codegen/schedule.rs | |
parent | c83b15b643346c54f09ef130b5abd5ca31abfcd5 (diff) | |
download | rtic-524273c96a978299b64e51a9cdcc007585a0f170.tar.gz rtic-524273c96a978299b64e51a9cdcc007585a0f170.tar.zst rtic-524273c96a978299b64e51a9cdcc007585a0f170.zip |
Now with spawn/schedule from anywhere
Diffstat (limited to 'macros/src/codegen/schedule.rs')
-rw-r--r-- | macros/src/codegen/schedule.rs | 90 |
1 files changed, 0 insertions, 90 deletions
diff --git a/macros/src/codegen/schedule.rs b/macros/src/codegen/schedule.rs deleted file mode 100644 index 5a887496..00000000 --- a/macros/src/codegen/schedule.rs +++ /dev/null @@ -1,90 +0,0 @@ -use std::collections::HashSet; - -use proc_macro2::TokenStream as TokenStream2; -use quote::quote; -use rtic_syntax::ast::App; - -use crate::{ - check::Extra, - codegen::{schedule_body, util}, -}; - -/// Generates all `${ctxt}::Schedule` methods -pub fn codegen(app: &App, extra: &Extra) -> Vec<TokenStream2> { - let mut items = vec![]; - - let mut seen = HashSet::<_>::new(); - for (scheduler, schedulees) in app.schedule_callers() { - let m = extra.monotonic(); - let instant = quote!(<#m as rtic::Monotonic>::Instant); - - let mut methods = vec![]; - - for name in schedulees { - let schedulee = &app.software_tasks[name]; - let cfgs = &schedulee.cfgs; - let (args, _, untupled, ty) = util::regroup_inputs(&schedulee.inputs); - let args = &args; - - if scheduler.is_init() { - // `init` uses a special `schedule` implementation; it doesn't use the - // `schedule_${name}` functions which are shared by other contexts - - let body = schedule_body::codegen(scheduler, &name, app); - - methods.push(quote!( - #(#cfgs)* - pub fn #name(&self, instant: #instant #(,#args)*) -> Result<(), #ty> { - #body - } - )); - } else { - let schedule = util::schedule_ident(name); - - if !seen.contains(name) { - // Generate a `schedule_${name}_S${sender}` function - seen.insert(name); - - let body = schedule_body::codegen(scheduler, &name, app); - - items.push(quote!( - #(#cfgs)* - pub unsafe fn #schedule( - priority: &rtic::export::Priority, - instant: #instant - #(,#args)* - ) -> Result<(), #ty> { - #body - } - )); - } - - methods.push(quote!( - #(#cfgs)* - #[inline(always)] - pub fn #name(&self, instant: #instant #(,#args)*) -> Result<(), #ty> { - unsafe { - #schedule(self.priority(), instant #(,#untupled)*) - } - } - )); - } - } - - let lt = if scheduler.is_init() { - None - } else { - Some(quote!('a)) - }; - - let scheduler = scheduler.ident(app); - debug_assert!(!methods.is_empty()); - items.push(quote!( - impl<#lt> #scheduler::Schedule<#lt> { - #(#methods)* - } - )); - } - - items -} |