diff options
| author | Dániel Buga <[email protected]> | 2023-06-25 22:32:24 +0200 |
|---|---|---|
| committer | Dániel Buga <[email protected]> | 2023-06-25 23:10:48 +0200 |
| commit | 2809e926cf8a3a1556c674a7b17c8db4b926f243 (patch) | |
| tree | 6abd8e0d5ed477671ae7da1fe533ea929ef3fac0 | |
| parent | aa0ab06645446bcb4b99a9407dc9c6c58030d8de (diff) | |
Allow arbitrary expressions as pool_size
| -rw-r--r-- | embassy-macros/src/macros/task.rs | 18 |
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 @@ | |||
| 1 | use darling::export::NestedMeta; | 1 | use darling::export::NestedMeta; |
| 2 | use darling::FromMeta; | 2 | use darling::FromMeta; |
| 3 | use proc_macro2::TokenStream; | 3 | use proc_macro2::{Span, TokenStream}; |
| 4 | use quote::{format_ident, quote}; | 4 | use quote::{format_ident, quote}; |
| 5 | use syn::{parse_quote, ItemFn, ReturnType, Type}; | 5 | use syn::{parse_quote, Expr, ExprLit, ItemFn, Lit, LitInt, ReturnType, Type}; |
| 6 | 6 | ||
| 7 | use crate::util::ctxt::Ctxt; | 7 | use crate::util::ctxt::Ctxt; |
| 8 | 8 | ||
| 9 | #[derive(Debug, FromMeta)] | 9 | #[derive(Debug, FromMeta)] |
| 10 | struct Args { | 10 | struct Args { |
| 11 | #[darling(default)] | 11 | #[darling(default)] |
| 12 | pool_size: Option<usize>, | 12 | pool_size: Option<syn::Expr>, |
| 13 | } | 13 | } |
| 14 | 14 | ||
| 15 | pub fn run(args: &[NestedMeta], f: syn::ItemFn) -> Result<TokenStream, TokenStream> { | 15 | pub 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 | }; |
