diff options
| author | Dario Nieuwenhuis <[email protected]> | 2024-12-16 16:52:21 +0000 |
|---|---|---|
| committer | GitHub <[email protected]> | 2024-12-16 16:52:21 +0000 |
| commit | d3f0294fb12e060c4a3ba557ff95766d1c3686e0 (patch) | |
| tree | 7709019cf01d0b2d341ad4ee760dd09c57f0c74d /embassy-executor/src/spawner.rs | |
| parent | 50d67083b899f4398ded93966df350935e12f343 (diff) | |
| parent | b47a631abf0c200c3b29b8e4ec199421835a0525 (diff) | |
Merge pull request #3655 from bugadani/header-executor
Fix racy access of TaskHeader::executor
Diffstat (limited to 'embassy-executor/src/spawner.rs')
| -rw-r--r-- | embassy-executor/src/spawner.rs | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/embassy-executor/src/spawner.rs b/embassy-executor/src/spawner.rs index 271606244..16347ad71 100644 --- a/embassy-executor/src/spawner.rs +++ b/embassy-executor/src/spawner.rs | |||
| @@ -1,6 +1,7 @@ | |||
| 1 | use core::future::poll_fn; | 1 | use core::future::poll_fn; |
| 2 | use core::marker::PhantomData; | 2 | use core::marker::PhantomData; |
| 3 | use core::mem; | 3 | use core::mem; |
| 4 | use core::sync::atomic::Ordering; | ||
| 4 | use core::task::Poll; | 5 | use core::task::Poll; |
| 5 | 6 | ||
| 6 | use super::raw; | 7 | use super::raw; |
| @@ -92,7 +93,13 @@ impl Spawner { | |||
| 92 | pub async fn for_current_executor() -> Self { | 93 | pub async fn for_current_executor() -> Self { |
| 93 | poll_fn(|cx| { | 94 | poll_fn(|cx| { |
| 94 | let task = raw::task_from_waker(cx.waker()); | 95 | let task = raw::task_from_waker(cx.waker()); |
| 95 | let executor = unsafe { task.header().executor.get().unwrap_unchecked() }; | 96 | let executor = unsafe { |
| 97 | task.header() | ||
| 98 | .executor | ||
| 99 | .load(Ordering::Relaxed) | ||
| 100 | .as_ref() | ||
| 101 | .unwrap_unchecked() | ||
| 102 | }; | ||
| 96 | let executor = unsafe { raw::Executor::wrap(executor) }; | 103 | let executor = unsafe { raw::Executor::wrap(executor) }; |
| 97 | Poll::Ready(Self::new(executor)) | 104 | Poll::Ready(Self::new(executor)) |
| 98 | }) | 105 | }) |
| @@ -164,7 +171,13 @@ impl SendSpawner { | |||
| 164 | pub async fn for_current_executor() -> Self { | 171 | pub async fn for_current_executor() -> Self { |
| 165 | poll_fn(|cx| { | 172 | poll_fn(|cx| { |
| 166 | let task = raw::task_from_waker(cx.waker()); | 173 | let task = raw::task_from_waker(cx.waker()); |
| 167 | let executor = unsafe { task.header().executor.get().unwrap_unchecked() }; | 174 | let executor = unsafe { |
| 175 | task.header() | ||
| 176 | .executor | ||
| 177 | .load(Ordering::Relaxed) | ||
| 178 | .as_ref() | ||
| 179 | .unwrap_unchecked() | ||
| 180 | }; | ||
| 168 | Poll::Ready(Self::new(executor)) | 181 | Poll::Ready(Self::new(executor)) |
| 169 | }) | 182 | }) |
| 170 | .await | 183 | .await |
