diff options
| author | Matthew Tran <[email protected]> | 2025-03-29 02:45:48 -0500 |
|---|---|---|
| committer | Matthew Tran <[email protected]> | 2025-03-29 03:52:00 -0500 |
| commit | 034e9fc218f1a348f451f56a5b9f3941fc046b1a (patch) | |
| tree | c7d366b388eaee60fa7f8ebb5a077bf42df20898 | |
| parent | 35b353ab948256f4ae959767a7652c24bd42cd57 (diff) | |
Move macro helper functions to embassy-executor
| -rw-r--r-- | embassy-executor-macros/src/macros/task.rs | 35 | ||||
| -rw-r--r-- | embassy-executor/src/lib.rs | 26 |
2 files changed, 29 insertions, 32 deletions
diff --git a/embassy-executor-macros/src/macros/task.rs b/embassy-executor-macros/src/macros/task.rs index e5523c5cd..91d6beee8 100644 --- a/embassy-executor-macros/src/macros/task.rs +++ b/embassy-executor-macros/src/macros/task.rs | |||
| @@ -145,35 +145,6 @@ 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 | // We use Fut instead of F::Fut because F::Fut causes the compiler to generate some ugly | ||
| 149 | // unrelated errors when the task has a compile error. | ||
| 150 | const fn __task_pool_size<F, Args, Fut>(_: F) -> usize | ||
| 151 | where | ||
| 152 | F: #embassy_executor::_export::TaskFn<Args, Fut = Fut>, | ||
| 153 | Fut: ::core::future::Future + 'static, | ||
| 154 | { | ||
| 155 | ::core::mem::size_of::< | ||
| 156 | #embassy_executor::raw::TaskPool<Fut, POOL_SIZE> | ||
| 157 | >() | ||
| 158 | } | ||
| 159 | const fn __task_pool_align<F, Args, Fut>(_: F) -> usize | ||
| 160 | where | ||
| 161 | F: #embassy_executor::_export::TaskFn<Args, Fut = Fut>, | ||
| 162 | Fut: ::core::future::Future + 'static, | ||
| 163 | { | ||
| 164 | ::core::mem::align_of::< | ||
| 165 | #embassy_executor::raw::TaskPool<Fut, POOL_SIZE> | ||
| 166 | >() | ||
| 167 | } | ||
| 168 | |||
| 169 | const fn __task_pool_new<F, Args, Fut>(_: F) -> #embassy_executor::raw::TaskPool<Fut, POOL_SIZE> | ||
| 170 | where | ||
| 171 | F: #embassy_executor::_export::TaskFn<Args, Fut = Fut>, | ||
| 172 | Fut: ::core::future::Future + 'static, | ||
| 173 | { | ||
| 174 | #embassy_executor::raw::TaskPool::new() | ||
| 175 | } | ||
| 176 | |||
| 177 | const fn __task_pool_get<F, Args, Fut>(_: F) -> &'static #embassy_executor::raw::TaskPool<Fut, POOL_SIZE> | 148 | const fn __task_pool_get<F, Args, Fut>(_: F) -> &'static #embassy_executor::raw::TaskPool<Fut, POOL_SIZE> |
| 178 | where | 149 | where |
| 179 | F: #embassy_executor::_export::TaskFn<Args, Fut = Fut>, | 150 | F: #embassy_executor::_export::TaskFn<Args, Fut = Fut>, |
| @@ -184,9 +155,9 @@ pub fn run(args: TokenStream, item: TokenStream) -> TokenStream { | |||
| 184 | 155 | ||
| 185 | const POOL_SIZE: usize = #pool_size; | 156 | const POOL_SIZE: usize = #pool_size; |
| 186 | static POOL: #embassy_executor::_export::TaskPoolHolder< | 157 | static POOL: #embassy_executor::_export::TaskPoolHolder< |
| 187 | {__task_pool_size(#task_inner_ident)}, | 158 | {#embassy_executor::_export::task_pool_size::<_, _, _, POOL_SIZE>(#task_inner_ident)}, |
| 188 | {__task_pool_align(#task_inner_ident)}, | 159 | {#embassy_executor::_export::task_pool_align::<_, _, _, POOL_SIZE>(#task_inner_ident)}, |
| 189 | > = unsafe { ::core::mem::transmute(__task_pool_new(#task_inner_ident)) }; | 160 | > = unsafe { ::core::mem::transmute(#embassy_executor::_export::task_pool_new::<_, _, _, POOL_SIZE>(#task_inner_ident)) }; |
| 190 | unsafe { __task_pool_get(#task_inner_ident)._spawn_async_fn(move || #task_inner_ident(#(#full_args,)*)) } | 161 | unsafe { __task_pool_get(#task_inner_ident)._spawn_async_fn(move || #task_inner_ident(#(#full_args,)*)) } |
| 191 | }; | 162 | }; |
| 192 | 163 | ||
diff --git a/embassy-executor/src/lib.rs b/embassy-executor/src/lib.rs index 5485f6a6a..d6bd63665 100644 --- a/embassy-executor/src/lib.rs +++ b/embassy-executor/src/lib.rs | |||
| @@ -59,6 +59,8 @@ pub mod _export { | |||
| 59 | use core::future::Future; | 59 | use core::future::Future; |
| 60 | use core::mem::MaybeUninit; | 60 | use core::mem::MaybeUninit; |
| 61 | 61 | ||
| 62 | use crate::raw::TaskPool; | ||
| 63 | |||
| 62 | pub trait TaskFn<Args>: Copy { | 64 | pub trait TaskFn<Args>: Copy { |
| 63 | type Fut: Future + 'static; | 65 | type Fut: Future + 'static; |
| 64 | } | 66 | } |
| @@ -116,6 +118,30 @@ pub mod _export { | |||
| 116 | } | 118 | } |
| 117 | } | 119 | } |
| 118 | 120 | ||
| 121 | pub const fn task_pool_size<F, Args, Fut, const POOL_SIZE: usize>(_: F) -> usize | ||
| 122 | where | ||
| 123 | F: TaskFn<Args, Fut = Fut>, | ||
| 124 | Fut: Future + 'static, | ||
| 125 | { | ||
| 126 | size_of::<TaskPool<Fut, POOL_SIZE>>() | ||
| 127 | } | ||
| 128 | |||
| 129 | pub const fn task_pool_align<F, Args, Fut, const POOL_SIZE: usize>(_: F) -> usize | ||
| 130 | where | ||
| 131 | F: TaskFn<Args, Fut = Fut>, | ||
| 132 | Fut: Future + 'static, | ||
| 133 | { | ||
| 134 | align_of::<TaskPool<Fut, POOL_SIZE>>() | ||
| 135 | } | ||
| 136 | |||
| 137 | pub const fn task_pool_new<F, Args, Fut, const POOL_SIZE: usize>(_: F) -> TaskPool<Fut, POOL_SIZE> | ||
| 138 | where | ||
| 139 | F: TaskFn<Args, Fut = Fut>, | ||
| 140 | Fut: Future + 'static, | ||
| 141 | { | ||
| 142 | TaskPool::new() | ||
| 143 | } | ||
| 144 | |||
| 119 | #[allow(private_bounds)] | 145 | #[allow(private_bounds)] |
| 120 | #[repr(transparent)] | 146 | #[repr(transparent)] |
| 121 | pub struct Align<const N: usize>([<Self as Alignment>::Archetype; 0]) | 147 | pub struct Align<const N: usize>([<Self as Alignment>::Archetype; 0]) |
