diff options
Diffstat (limited to 'embassy-executor/src/spawner.rs')
| -rw-r--r-- | embassy-executor/src/spawner.rs | 53 |
1 files changed, 51 insertions, 2 deletions
diff --git a/embassy-executor/src/spawner.rs b/embassy-executor/src/spawner.rs index ff243081c..522d97db3 100644 --- a/embassy-executor/src/spawner.rs +++ b/embassy-executor/src/spawner.rs | |||
| @@ -5,6 +5,8 @@ use core::sync::atomic::Ordering; | |||
| 5 | use core::task::Poll; | 5 | use core::task::Poll; |
| 6 | 6 | ||
| 7 | use super::raw; | 7 | use super::raw; |
| 8 | #[cfg(feature = "trace")] | ||
| 9 | use crate::raw::trace::TaskRefTrace; | ||
| 8 | 10 | ||
| 9 | /// Token to spawn a newly-created task in an executor. | 11 | /// Token to spawn a newly-created task in an executor. |
| 10 | /// | 12 | /// |
| @@ -22,7 +24,7 @@ use super::raw; | |||
| 22 | /// Once you've invoked a task function and obtained a SpawnToken, you *must* spawn it. | 24 | /// Once you've invoked a task function and obtained a SpawnToken, you *must* spawn it. |
| 23 | #[must_use = "Calling a task function does nothing on its own. You must spawn the returned SpawnToken, typically with Spawner::spawn()"] | 25 | #[must_use = "Calling a task function does nothing on its own. You must spawn the returned SpawnToken, typically with Spawner::spawn()"] |
| 24 | pub struct SpawnToken<S> { | 26 | pub struct SpawnToken<S> { |
| 25 | raw_task: Option<raw::TaskRef>, | 27 | pub(crate) raw_task: Option<raw::TaskRef>, |
| 26 | phantom: PhantomData<*mut S>, | 28 | phantom: PhantomData<*mut S>, |
| 27 | } | 29 | } |
| 28 | 30 | ||
| @@ -103,7 +105,7 @@ impl core::error::Error for SpawnError {} | |||
| 103 | /// If you want to spawn tasks from another thread, use [SendSpawner]. | 105 | /// If you want to spawn tasks from another thread, use [SendSpawner]. |
| 104 | #[derive(Copy, Clone)] | 106 | #[derive(Copy, Clone)] |
| 105 | pub struct Spawner { | 107 | pub struct Spawner { |
| 106 | executor: &'static raw::Executor, | 108 | pub(crate) executor: &'static raw::Executor, |
| 107 | not_send: PhantomData<*mut ()>, | 109 | not_send: PhantomData<*mut ()>, |
| 108 | } | 110 | } |
| 109 | 111 | ||
| @@ -180,6 +182,53 @@ impl Spawner { | |||
| 180 | } | 182 | } |
| 181 | } | 183 | } |
| 182 | 184 | ||
| 185 | /// Extension trait adding tracing capabilities to the Spawner | ||
| 186 | /// | ||
| 187 | /// This trait provides an additional method to spawn tasks with an associated name, | ||
| 188 | /// which can be useful for debugging and tracing purposes. | ||
| 189 | pub trait SpawnerTraceExt { | ||
| 190 | /// Spawns a new task with a specified name. | ||
| 191 | /// | ||
| 192 | /// # Arguments | ||
| 193 | /// * `name` - Static string name to associate with the task | ||
| 194 | /// * `token` - Token representing the task to spawn | ||
| 195 | /// | ||
| 196 | /// # Returns | ||
| 197 | /// Result indicating whether the spawn was successful | ||
| 198 | fn spawn_named<S>(&self, name: &'static str, token: SpawnToken<S>) -> Result<(), SpawnError>; | ||
| 199 | } | ||
| 200 | |||
| 201 | /// Implementation of the SpawnerTraceExt trait for Spawner when trace is enabled | ||
| 202 | #[cfg(feature = "trace")] | ||
| 203 | impl SpawnerTraceExt for Spawner { | ||
| 204 | fn spawn_named<S>(&self, name: &'static str, token: SpawnToken<S>) -> Result<(), SpawnError> { | ||
| 205 | let task = token.raw_task; | ||
| 206 | core::mem::forget(token); | ||
| 207 | |||
| 208 | match task { | ||
| 209 | Some(task) => { | ||
| 210 | // Set the name and ID when trace is enabled | ||
| 211 | task.set_name(Some(name)); | ||
| 212 | let task_id = task.as_ptr() as u32; | ||
| 213 | task.set_id(task_id); | ||
| 214 | |||
| 215 | unsafe { self.executor.spawn(task) }; | ||
| 216 | Ok(()) | ||
| 217 | } | ||
| 218 | None => Err(SpawnError::Busy), | ||
| 219 | } | ||
| 220 | } | ||
| 221 | } | ||
| 222 | |||
| 223 | /// Implementation of the SpawnerTraceExt trait for Spawner when trace is disabled | ||
| 224 | #[cfg(not(feature = "trace"))] | ||
| 225 | impl SpawnerTraceExt for Spawner { | ||
| 226 | fn spawn_named<S>(&self, _name: &'static str, token: SpawnToken<S>) -> Result<(), SpawnError> { | ||
| 227 | // When trace is disabled, just forward to regular spawn and ignore the name | ||
| 228 | self.spawn(token) | ||
| 229 | } | ||
| 230 | } | ||
| 231 | |||
| 183 | /// Handle to spawn tasks into an executor from any thread. | 232 | /// Handle to spawn tasks into an executor from any thread. |
| 184 | /// | 233 | /// |
| 185 | /// This Spawner can be used from any thread (it is Send), but it can | 234 | /// This Spawner can be used from any thread (it is Send), but it can |
