aboutsummaryrefslogtreecommitdiff
path: root/embassy-executor-macros
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2025-03-28 18:59:02 +0100
committerDario Nieuwenhuis <[email protected]>2025-03-28 19:11:53 +0100
commit695a6da322aa2d75c8f702b2ed8b67f9ad12c3a0 (patch)
tree06501a7878909c2d53b98d47756ff2b7e13dfcda /embassy-executor-macros
parentbda7ba7b149b19f1cb67c5f664ceaa10f071dce7 (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.rs38
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();