diff options
| author | Dario Nieuwenhuis <[email protected]> | 2025-03-28 18:59:02 +0100 |
|---|---|---|
| committer | Dario Nieuwenhuis <[email protected]> | 2025-03-28 19:11:53 +0100 |
| commit | 695a6da322aa2d75c8f702b2ed8b67f9ad12c3a0 (patch) | |
| tree | 06501a7878909c2d53b98d47756ff2b7e13dfcda /embassy-executor-macros | |
| parent | bda7ba7b149b19f1cb67c5f664ceaa10f071dce7 (diff) | |
Statically allocate task pools on stable Rust.
Thanks @0e4ef622 for the awesome idea of how to do it and the first implementation.
Co-Authored-By: Matthew Tran <[email protected]>
Diffstat (limited to 'embassy-executor-macros')
| -rw-r--r-- | embassy-executor-macros/src/macros/task.rs | 38 |
1 files changed, 36 insertions, 2 deletions
diff --git a/embassy-executor-macros/src/macros/task.rs b/embassy-executor-macros/src/macros/task.rs index e8134c6a9..8a2a7fdb9 100644 --- a/embassy-executor-macros/src/macros/task.rs +++ b/embassy-executor-macros/src/macros/task.rs | |||
| @@ -145,9 +145,43 @@ pub fn run(args: TokenStream, item: TokenStream) -> TokenStream { | |||
| 145 | }; | 145 | }; |
| 146 | #[cfg(not(feature = "nightly"))] | 146 | #[cfg(not(feature = "nightly"))] |
| 147 | let mut task_outer_body = quote! { | 147 | let mut task_outer_body = quote! { |
| 148 | const fn __task_pool_size<F, Args>(_: F) -> usize | ||
| 149 | where | ||
| 150 | F: #embassy_executor::_export::TaskFn<Args>, | ||
| 151 | { | ||
| 152 | ::core::mem::size_of::< | ||
| 153 | #embassy_executor::raw::TaskPool<F::Fut, POOL_SIZE> | ||
| 154 | >() | ||
| 155 | } | ||
| 156 | const fn __task_pool_align<F, Args>(_: F) -> usize | ||
| 157 | where | ||
| 158 | F: #embassy_executor::_export::TaskFn<Args>, | ||
| 159 | { | ||
| 160 | ::core::mem::align_of::< | ||
| 161 | #embassy_executor::raw::TaskPool<F::Fut, POOL_SIZE> | ||
| 162 | >() | ||
| 163 | } | ||
| 164 | |||
| 165 | const fn __task_pool_new<F, Args>(_: F) -> #embassy_executor::raw::TaskPool<F::Fut, POOL_SIZE> | ||
| 166 | where | ||
| 167 | F: #embassy_executor::_export::TaskFn<Args>, | ||
| 168 | { | ||
| 169 | #embassy_executor::raw::TaskPool::new() | ||
| 170 | } | ||
| 171 | |||
| 172 | const fn __task_pool_get<F, Args>(_: F) -> &'static #embassy_executor::raw::TaskPool<F::Fut, POOL_SIZE> | ||
| 173 | where | ||
| 174 | F: #embassy_executor::_export::TaskFn<Args> | ||
| 175 | { | ||
| 176 | unsafe { &*POOL.get().cast() } | ||
| 177 | } | ||
| 178 | |||
| 148 | const POOL_SIZE: usize = #pool_size; | 179 | const POOL_SIZE: usize = #pool_size; |
| 149 | static POOL: #embassy_executor::_export::TaskPoolRef = #embassy_executor::_export::TaskPoolRef::new(); | 180 | static POOL: #embassy_executor::_export::TaskPoolHolder< |
| 150 | unsafe { POOL.get::<_, POOL_SIZE>()._spawn_async_fn(move || #task_inner_ident(#(#full_args,)*)) } | 181 | {__task_pool_size(#task_inner_ident)}, |
| 182 | {__task_pool_align(#task_inner_ident)}, | ||
| 183 | > = unsafe { ::core::mem::transmute(__task_pool_new(#task_inner_ident)) }; | ||
| 184 | unsafe { __task_pool_get(#task_inner_ident)._spawn_async_fn(move || #task_inner_ident(#(#full_args,)*)) } | ||
| 151 | }; | 185 | }; |
| 152 | 186 | ||
| 153 | let task_outer_attrs = task_inner.attrs.clone(); | 187 | let task_outer_attrs = task_inner.attrs.clone(); |
