aboutsummaryrefslogtreecommitdiff
path: root/embassy-executor/src/spawner.rs
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2024-12-16 16:52:21 +0000
committerGitHub <[email protected]>2024-12-16 16:52:21 +0000
commitd3f0294fb12e060c4a3ba557ff95766d1c3686e0 (patch)
tree7709019cf01d0b2d341ad4ee760dd09c57f0c74d /embassy-executor/src/spawner.rs
parent50d67083b899f4398ded93966df350935e12f343 (diff)
parentb47a631abf0c200c3b29b8e4ec199421835a0525 (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.rs17
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 @@
1use core::future::poll_fn; 1use core::future::poll_fn;
2use core::marker::PhantomData; 2use core::marker::PhantomData;
3use core::mem; 3use core::mem;
4use core::sync::atomic::Ordering;
4use core::task::Poll; 5use core::task::Poll;
5 6
6use super::raw; 7use 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