aboutsummaryrefslogtreecommitdiff
path: root/macros/src/codegen/schedule.rs
diff options
context:
space:
mode:
authorGravatar Emil Fresk <emil.fresk@gmail.com> 2020-10-11 18:38:38 +0200
committerGravatar Emil Fresk <emil.fresk@gmail.com> 2020-10-11 18:38:38 +0200
commit524273c96a978299b64e51a9cdcc007585a0f170 (patch)
tree63e7f8bce84e1109e4814dbc7d48e837e5e60a6d /macros/src/codegen/schedule.rs
parentc83b15b643346c54f09ef130b5abd5ca31abfcd5 (diff)
downloadrtic-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.rs90
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
-}