diff options
| author | Dario Nieuwenhuis <[email protected]> | 2025-07-08 22:39:53 +0200 |
|---|---|---|
| committer | Dario Nieuwenhuis <[email protected]> | 2025-07-08 22:39:53 +0200 |
| commit | 0c136c7b050ded4bf660ea7a50381698ab9d5f09 (patch) | |
| tree | 5441615f6a9bd0cbe9e26d949999be6dc6e9e778 /embassy-executor/src/spawner.rs | |
| parent | 08c033ae2ea0a47ccb0e8c60938f63ca4df9a18a (diff) | |
executor: mark Spawner::for_current_executor() as unsafe.
It's unsound with manually-created Contexts, see https://github.com/embassy-rs/embassy/issues/4379
Diffstat (limited to 'embassy-executor/src/spawner.rs')
| -rw-r--r-- | embassy-executor/src/spawner.rs | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/embassy-executor/src/spawner.rs b/embassy-executor/src/spawner.rs index 522d97db3..2909d19a0 100644 --- a/embassy-executor/src/spawner.rs +++ b/embassy-executor/src/spawner.rs | |||
| @@ -122,10 +122,26 @@ impl Spawner { | |||
| 122 | /// This function is `async` just to get access to the current async | 122 | /// This function is `async` just to get access to the current async |
| 123 | /// context. It returns instantly, it does not block/yield. | 123 | /// context. It returns instantly, it does not block/yield. |
| 124 | /// | 124 | /// |
| 125 | /// Using this method is discouraged due to it being unsafe. Consider the following | ||
| 126 | /// alternatives instead: | ||
| 127 | /// | ||
| 128 | /// - Pass the initial `Spawner` as an argument to tasks. Note that it's `Copy`, so you can | ||
| 129 | /// make as many copies of it as you want. | ||
| 130 | /// - Use `SendSpawner::for_current_executor()` instead, which is safe but can only be used | ||
| 131 | /// if task arguments are `Send`. | ||
| 132 | /// | ||
| 133 | /// The only case where using this method is absolutely required is obtaining the `Spawner` | ||
| 134 | /// for an `InterruptExecutor`. | ||
| 135 | /// | ||
| 136 | /// # Safety | ||
| 137 | /// | ||
| 138 | /// You must only execute this with an async `Context` created by the Embassy executor. | ||
| 139 | /// You must not execute it with manually-created `Context`s. | ||
| 140 | /// | ||
| 125 | /// # Panics | 141 | /// # Panics |
| 126 | /// | 142 | /// |
| 127 | /// Panics if the current executor is not an Embassy executor. | 143 | /// Panics if the current executor is not an Embassy executor. |
| 128 | pub fn for_current_executor() -> impl Future<Output = Self> { | 144 | pub unsafe fn for_current_executor() -> impl Future<Output = Self> { |
| 129 | poll_fn(|cx| { | 145 | poll_fn(|cx| { |
| 130 | let task = raw::task_from_waker(cx.waker()); | 146 | let task = raw::task_from_waker(cx.waker()); |
| 131 | let executor = unsafe { | 147 | let executor = unsafe { |
