diff options
| author | Dario Nieuwenhuis <[email protected]> | 2023-09-15 18:45:21 +0000 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-09-15 18:45:21 +0000 |
| commit | 5a158b94bde3a5fee096be213d2afede06d9f019 (patch) | |
| tree | 9b9b90375126b3c246b0b809c99f82fa954b3d9d | |
| parent | c091ed2f63da1c2135a84b7bfeb2003514c02526 (diff) | |
| parent | b9d4b18f14ad477c4b554498282ac467ff9cb823 (diff) | |
Merge pull request #1896 from haileys/inline-never-for-rvo
Write to TaskStorage::future via never-inlined fn to encourage RVO
| -rw-r--r-- | embassy-executor/src/arch/wasm.rs | 5 | ||||
| -rw-r--r-- | embassy-executor/src/raw/mod.rs | 2 | ||||
| -rw-r--r-- | embassy-executor/src/raw/util.rs | 5 |
3 files changed, 7 insertions, 5 deletions
diff --git a/embassy-executor/src/arch/wasm.rs b/embassy-executor/src/arch/wasm.rs index 934fd69e5..15aed867a 100644 --- a/embassy-executor/src/arch/wasm.rs +++ b/embassy-executor/src/arch/wasm.rs | |||
| @@ -73,9 +73,10 @@ mod thread { | |||
| 73 | pub fn start(&'static mut self, init: impl FnOnce(Spawner)) { | 73 | pub fn start(&'static mut self, init: impl FnOnce(Spawner)) { |
| 74 | unsafe { | 74 | unsafe { |
| 75 | let executor = &self.inner; | 75 | let executor = &self.inner; |
| 76 | self.ctx.closure.write(Closure::new(move |_| { | 76 | let future = Closure::new(move |_| { |
| 77 | executor.poll(); | 77 | executor.poll(); |
| 78 | })); | 78 | }); |
| 79 | self.ctx.closure.write_in_place(|| future); | ||
| 79 | init(self.inner.spawner()); | 80 | init(self.inner.spawner()); |
| 80 | } | 81 | } |
| 81 | } | 82 | } |
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) { |
