aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDániel Buga <[email protected]>2023-06-25 22:32:24 +0200
committerDániel Buga <[email protected]>2023-06-25 23:10:48 +0200
commit2809e926cf8a3a1556c674a7b17c8db4b926f243 (patch)
tree6abd8e0d5ed477671ae7da1fe533ea929ef3fac0
parentaa0ab06645446bcb4b99a9407dc9c6c58030d8de (diff)
Allow arbitrary expressions as pool_size
-rw-r--r--embassy-macros/src/macros/task.rs18
1 files changed, 9 insertions, 9 deletions
diff --git a/embassy-macros/src/macros/task.rs b/embassy-macros/src/macros/task.rs
index 8c4bf7265..1d30434e9 100644
--- a/embassy-macros/src/macros/task.rs
+++ b/embassy-macros/src/macros/task.rs
@@ -1,21 +1,24 @@
1use darling::export::NestedMeta; 1use darling::export::NestedMeta;
2use darling::FromMeta; 2use darling::FromMeta;
3use proc_macro2::TokenStream; 3use proc_macro2::{Span, TokenStream};
4use quote::{format_ident, quote}; 4use quote::{format_ident, quote};
5use syn::{parse_quote, ItemFn, ReturnType, Type}; 5use syn::{parse_quote, Expr, ExprLit, ItemFn, Lit, LitInt, ReturnType, Type};
6 6
7use crate::util::ctxt::Ctxt; 7use crate::util::ctxt::Ctxt;
8 8
9#[derive(Debug, FromMeta)] 9#[derive(Debug, FromMeta)]
10struct Args { 10struct Args {
11 #[darling(default)] 11 #[darling(default)]
12 pool_size: Option<usize>, 12 pool_size: Option<syn::Expr>,
13} 13}
14 14
15pub fn run(args: &[NestedMeta], f: syn::ItemFn) -> Result<TokenStream, TokenStream> { 15pub fn run(args: &[NestedMeta], f: syn::ItemFn) -> Result<TokenStream, TokenStream> {
16 let args = Args::from_list(args).map_err(|e| e.write_errors())?; 16 let args = Args::from_list(args).map_err(|e| e.write_errors())?;
17 17
18 let pool_size: usize = args.pool_size.unwrap_or(1); 18 let pool_size = args.pool_size.unwrap_or(Expr::Lit(ExprLit {
19 attrs: vec![],
20 lit: Lit::Int(LitInt::new("1", Span::call_site())),
21 }));
19 22
20 let ctxt = Ctxt::new(); 23 let ctxt = Ctxt::new();
21 24
@@ -46,10 +49,6 @@ pub fn run(args: &[NestedMeta], f: syn::ItemFn) -> Result<TokenStream, TokenStre
46 }, 49 },
47 } 50 }
48 51
49 if pool_size < 1 {
50 ctxt.error_spanned_by(&f.sig, "pool_size must be 1 or greater");
51 }
52
53 let mut arg_names = Vec::new(); 52 let mut arg_names = Vec::new();
54 let mut fargs = f.sig.inputs.clone(); 53 let mut fargs = f.sig.inputs.clone();
55 54
@@ -83,7 +82,8 @@ pub fn run(args: &[NestedMeta], f: syn::ItemFn) -> Result<TokenStream, TokenStre
83 let mut task_outer: ItemFn = parse_quote! { 82 let mut task_outer: ItemFn = parse_quote! {
84 #visibility fn #task_ident(#fargs) -> ::embassy_executor::SpawnToken<impl Sized> { 83 #visibility fn #task_ident(#fargs) -> ::embassy_executor::SpawnToken<impl Sized> {
85 type Fut = impl ::core::future::Future + 'static; 84 type Fut = impl ::core::future::Future + 'static;
86 static POOL: ::embassy_executor::raw::TaskPool<Fut, #pool_size> = ::embassy_executor::raw::TaskPool::new(); 85 const POOL_SIZE: usize = #pool_size;
86 static POOL: ::embassy_executor::raw::TaskPool<Fut, POOL_SIZE> = ::embassy_executor::raw::TaskPool::new();
87 unsafe { POOL._spawn_async_fn(move || #task_inner_ident(#(#arg_names,)*)) } 87 unsafe { POOL._spawn_async_fn(move || #task_inner_ident(#(#arg_names,)*)) }
88 } 88 }
89 }; 89 };