From d28b114c0b3eff133db69768f725cf5f1744fb2e Mon Sep 17 00:00:00 2001 From: Oleksandr Babak Date: Mon, 27 Jan 2025 11:00:10 +0100 Subject: [PATCH] feat(rtic-macros): expose task waker --- rtic-macros/src/codegen/module.rs | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/rtic-macros/src/codegen/module.rs b/rtic-macros/src/codegen/module.rs index a8700c5bafb..c10c123ce2d 100644 --- a/rtic-macros/src/codegen/module.rs +++ b/rtic-macros/src/codegen/module.rs @@ -158,6 +158,7 @@ pub fn codegen(ctxt: Context, app: &App, analysis: &Analysis) -> TokenStream2 { }; let internal_spawn_ident = util::internal_task_ident(name, "spawn"); + let internal_waker_ident = util::internal_task_ident(name, "waker"); let from_ptr_n_args = util::from_ptr_n_args_ident(spawnee.inputs.len()); let (input_args, input_tupled, input_untupled, input_ty) = util::regroup_inputs(&spawnee.inputs); @@ -184,11 +185,36 @@ pub fn codegen(ctxt: Context, app: &App, analysis: &Analysis) -> TokenStream2 { } )); + // Waker + items.push(quote!( + #(#cfgs)* + /// Gives waker to the task + #[allow(non_snake_case)] + #[doc(hidden)] + pub fn #internal_waker_ident() -> ::core::task::Waker { + // SAFETY: If `try_allocate` succeeds one must call `spawn`, which we do. + unsafe { + let exec = rtic::export::executor::AsyncTaskExecutor::#from_ptr_n_args(#name, &#exec_name); + exec.waker(|| { + let exec = rtic::export::executor::AsyncTaskExecutor::#from_ptr_n_args(#name, &#exec_name); + exec.set_pending(); + #pend_interrupt + }) + } + } + )); + module_items.push(quote!( #(#cfgs)* #[doc(inline)] pub use super::#internal_spawn_ident as spawn; )); + + module_items.push(quote!( + #(#cfgs)* + #[doc(inline)] + pub use super::#internal_waker_ident as waker; + )); } if items.is_empty() {