aboutsummaryrefslogtreecommitdiff
path: root/embassy-executor
diff options
context:
space:
mode:
authorHailey Somerville <[email protected]>2023-09-14 13:03:38 +1000
committerHailey Somerville <[email protected]>2023-09-14 13:42:11 +1000
commit3a1ed823f87d6e823763419245d229a0edb09db8 (patch)
treeb5b30fabc92906c25e50d7be1fd5656537c92670 /embassy-executor
parent5e381d49da3d934defab072cecbac640b378138e (diff)
write to TaskStorage::future via inline(never) fn to encourage RVO
Diffstat (limited to 'embassy-executor')
-rw-r--r--embassy-executor/src/raw/mod.rs2
-rw-r--r--embassy-executor/src/raw/util.rs5
2 files changed, 4 insertions, 3 deletions
diff --git a/embassy-executor/src/raw/mod.rs b/embassy-executor/src/raw/mod.rs
index c1d82e18a..6d2c1c18a 100644
--- a/embassy-executor/src/raw/mod.rs
+++ b/embassy-executor/src/raw/mod.rs
@@ -203,7 +203,7 @@ impl<F: Future + 'static> AvailableTask<F> {
203 fn initialize_impl<S>(self, future: impl FnOnce() -> F) -> SpawnToken<S> { 203 fn initialize_impl<S>(self, future: impl FnOnce() -> F) -> SpawnToken<S> {
204 unsafe { 204 unsafe {
205 self.task.raw.poll_fn.set(Some(TaskStorage::<F>::poll)); 205 self.task.raw.poll_fn.set(Some(TaskStorage::<F>::poll));
206 self.task.future.write(future()); 206 self.task.future.write_in_place(future);
207 207
208 let task = TaskRef::new(self.task); 208 let task = TaskRef::new(self.task);
209 209
diff --git a/embassy-executor/src/raw/util.rs b/embassy-executor/src/raw/util.rs
index e2e8f4df8..c46085e45 100644
--- a/embassy-executor/src/raw/util.rs
+++ b/embassy-executor/src/raw/util.rs
@@ -17,8 +17,9 @@ impl<T> UninitCell<T> {
17 &mut *self.as_mut_ptr() 17 &mut *self.as_mut_ptr()
18 } 18 }
19 19
20 pub unsafe fn write(&self, val: T) { 20 #[inline(never)]
21 ptr::write(self.as_mut_ptr(), val) 21 pub unsafe fn write_in_place(&self, func: impl FnOnce() -> T) {
22 ptr::write(self.as_mut_ptr(), func())
22 } 23 }
23 24
24 pub unsafe fn drop_in_place(&self) { 25 pub unsafe fn drop_in_place(&self) {