diff options
| author | Dario Nieuwenhuis <[email protected]> | 2025-07-08 20:19:01 +0200 |
|---|---|---|
| committer | Dario Nieuwenhuis <[email protected]> | 2025-07-08 20:27:35 +0200 |
| commit | 2fe2a0cf9c15bf7e84134cd7fec48017bb0a0db7 (patch) | |
| tree | e9603081d1c84297878ace77762adbbaa92cb7a3 /embassy-executor-macros/src | |
| parent | 504261a8d0bc58fcfa8b73245eaf859f88d62a94 (diff) | |
excutor: fix Send unsoundness with `-> impl Future` tasks.
Diffstat (limited to 'embassy-executor-macros/src')
| -rw-r--r-- | embassy-executor-macros/src/macros/task.rs | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/embassy-executor-macros/src/macros/task.rs b/embassy-executor-macros/src/macros/task.rs index 91bf8e940..1c5e3571d 100644 --- a/embassy-executor-macros/src/macros/task.rs +++ b/embassy-executor-macros/src/macros/task.rs | |||
| @@ -131,6 +131,12 @@ pub fn run(args: TokenStream, item: TokenStream) -> TokenStream { | |||
| 131 | )); | 131 | )); |
| 132 | } | 132 | } |
| 133 | 133 | ||
| 134 | let spawn = if returns_impl_trait { | ||
| 135 | quote!(spawn) | ||
| 136 | } else { | ||
| 137 | quote!(_spawn_async_fn) | ||
| 138 | }; | ||
| 139 | |||
| 134 | #[cfg(feature = "nightly")] | 140 | #[cfg(feature = "nightly")] |
| 135 | let mut task_outer_body = quote! { | 141 | let mut task_outer_body = quote! { |
| 136 | trait _EmbassyInternalTaskTrait { | 142 | trait _EmbassyInternalTaskTrait { |
| @@ -147,7 +153,7 @@ pub fn run(args: TokenStream, item: TokenStream) -> TokenStream { | |||
| 147 | 153 | ||
| 148 | const POOL_SIZE: usize = #pool_size; | 154 | const POOL_SIZE: usize = #pool_size; |
| 149 | static POOL: #embassy_executor::raw::TaskPool<<() as _EmbassyInternalTaskTrait>::Fut, POOL_SIZE> = #embassy_executor::raw::TaskPool::new(); | 155 | static POOL: #embassy_executor::raw::TaskPool<<() as _EmbassyInternalTaskTrait>::Fut, POOL_SIZE> = #embassy_executor::raw::TaskPool::new(); |
| 150 | unsafe { POOL._spawn_async_fn(move || <() as _EmbassyInternalTaskTrait>::construct(#(#full_args,)*)) } | 156 | unsafe { POOL.#spawn(move || <() as _EmbassyInternalTaskTrait>::construct(#(#full_args,)*)) } |
| 151 | }; | 157 | }; |
| 152 | #[cfg(not(feature = "nightly"))] | 158 | #[cfg(not(feature = "nightly"))] |
| 153 | let mut task_outer_body = quote! { | 159 | let mut task_outer_body = quote! { |
| @@ -164,7 +170,7 @@ pub fn run(args: TokenStream, item: TokenStream) -> TokenStream { | |||
| 164 | {#embassy_executor::_export::task_pool_size::<_, _, _, POOL_SIZE>(#task_inner_ident)}, | 170 | {#embassy_executor::_export::task_pool_size::<_, _, _, POOL_SIZE>(#task_inner_ident)}, |
| 165 | {#embassy_executor::_export::task_pool_align::<_, _, _, POOL_SIZE>(#task_inner_ident)}, | 171 | {#embassy_executor::_export::task_pool_align::<_, _, _, POOL_SIZE>(#task_inner_ident)}, |
| 166 | > = unsafe { ::core::mem::transmute(#embassy_executor::_export::task_pool_new::<_, _, _, POOL_SIZE>(#task_inner_ident)) }; | 172 | > = unsafe { ::core::mem::transmute(#embassy_executor::_export::task_pool_new::<_, _, _, POOL_SIZE>(#task_inner_ident)) }; |
| 167 | unsafe { __task_pool_get(#task_inner_ident)._spawn_async_fn(move || #task_inner_ident(#(#full_args,)*)) } | 173 | unsafe { __task_pool_get(#task_inner_ident).#spawn(move || #task_inner_ident(#(#full_args,)*)) } |
| 168 | }; | 174 | }; |
| 169 | 175 | ||
| 170 | let task_outer_attrs = task_inner.attrs.clone(); | 176 | let task_outer_attrs = task_inner.attrs.clone(); |
