From 7fd2ae774abc0a6c5e7124e7c00b0bfdf6e4f9a8 Mon Sep 17 00:00:00 2001 From: Gleb Pomykalov Date: Mon, 23 Aug 2021 01:17:12 +0000 Subject: [PATCH 01/16] Use uninitialized array in wake0 to prevent initialiation of each Option --- tokio/src/io/driver/scheduled_io.rs | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/tokio/src/io/driver/scheduled_io.rs b/tokio/src/io/driver/scheduled_io.rs index 51780107909..0aa8de299d0 100644 --- a/tokio/src/io/driver/scheduled_io.rs +++ b/tokio/src/io/driver/scheduled_io.rs @@ -3,6 +3,7 @@ use crate::loom::sync::atomic::AtomicUsize; use crate::loom::sync::Mutex; use crate::util::bit; use crate::util::slab::Entry; +use core::mem::MaybeUninit; use std::sync::atomic::Ordering::{AcqRel, Acquire, Release}; use std::task::{Context, Poll, Waker}; @@ -214,7 +215,10 @@ impl ScheduledIo { fn wake0(&self, ready: Ready, shutdown: bool) { const NUM_WAKERS: usize = 32; - let mut wakers: [Option; NUM_WAKERS] = Default::default(); + let mut wakers: [MaybeUninit>; NUM_WAKERS] = unsafe { + core::mem::MaybeUninit::uninit().assume_init() + }; + let mut curr = 0; let mut waiters = self.waiters.lock(); @@ -224,7 +228,7 @@ impl ScheduledIo { // check for AsyncRead slot if ready.is_readable() { if let Some(waker) = waiters.reader.take() { - wakers[curr] = Some(waker); + wakers[curr] = MaybeUninit::new(Some(waker)); curr += 1; } } @@ -232,7 +236,7 @@ impl ScheduledIo { // check for AsyncWrite slot if ready.is_writable() { if let Some(waker) = waiters.writer.take() { - wakers[curr] = Some(waker); + wakers[curr] = MaybeUninit::new(Some(waker)); curr += 1; } } @@ -248,7 +252,7 @@ impl ScheduledIo { if let Some(waker) = waiter.waker.take() { waiter.is_ready = true; - wakers[curr] = Some(waker); + wakers[curr] = MaybeUninit::new(Some(waker)); curr += 1; } } @@ -260,8 +264,8 @@ impl ScheduledIo { drop(waiters); - for waker in wakers.iter_mut().take(curr) { - waker.take().unwrap().wake(); + for waker in &mut wakers[..curr] { + unsafe { &mut *waker.as_mut_ptr() }.take().unwrap().wake(); } curr = 0; @@ -273,8 +277,8 @@ impl ScheduledIo { // Release the lock before notifying drop(waiters); - for waker in wakers.iter_mut().take(curr) { - waker.take().unwrap().wake(); + for waker in &mut wakers[..curr] { + unsafe { &mut *waker.as_mut_ptr() }.take().unwrap().wake(); } } From 01b91abefd49698cd4e1e66f2dbbb1ad568f0e43 Mon Sep 17 00:00:00 2001 From: Gleb Pomykalov Date: Mon, 23 Aug 2021 11:36:15 +0300 Subject: [PATCH 02/16] avoid using Option --- tokio/src/io/driver/scheduled_io.rs | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/tokio/src/io/driver/scheduled_io.rs b/tokio/src/io/driver/scheduled_io.rs index 0aa8de299d0..9420f7e99fd 100644 --- a/tokio/src/io/driver/scheduled_io.rs +++ b/tokio/src/io/driver/scheduled_io.rs @@ -3,7 +3,7 @@ use crate::loom::sync::atomic::AtomicUsize; use crate::loom::sync::Mutex; use crate::util::bit; use crate::util::slab::Entry; -use core::mem::MaybeUninit; +use core::mem::{self, MaybeUninit}; use std::sync::atomic::Ordering::{AcqRel, Acquire, Release}; use std::task::{Context, Poll, Waker}; @@ -215,7 +215,7 @@ impl ScheduledIo { fn wake0(&self, ready: Ready, shutdown: bool) { const NUM_WAKERS: usize = 32; - let mut wakers: [MaybeUninit>; NUM_WAKERS] = unsafe { + let mut wakers: [MaybeUninit; NUM_WAKERS] = unsafe { core::mem::MaybeUninit::uninit().assume_init() }; @@ -228,7 +228,7 @@ impl ScheduledIo { // check for AsyncRead slot if ready.is_readable() { if let Some(waker) = waiters.reader.take() { - wakers[curr] = MaybeUninit::new(Some(waker)); + wakers[curr] = MaybeUninit::new(waker); curr += 1; } } @@ -236,7 +236,7 @@ impl ScheduledIo { // check for AsyncWrite slot if ready.is_writable() { if let Some(waker) = waiters.writer.take() { - wakers[curr] = MaybeUninit::new(Some(waker)); + wakers[curr] = MaybeUninit::new(waker); curr += 1; } } @@ -252,7 +252,7 @@ impl ScheduledIo { if let Some(waker) = waiter.waker.take() { waiter.is_ready = true; - wakers[curr] = MaybeUninit::new(Some(waker)); + wakers[curr] = MaybeUninit::new(waker); curr += 1; } } @@ -265,7 +265,10 @@ impl ScheduledIo { drop(waiters); for waker in &mut wakers[..curr] { - unsafe { &mut *waker.as_mut_ptr() }.take().unwrap().wake(); + unsafe { + mem::replace(waker, MaybeUninit::uninit()) + .assume_init() + }.wake() } curr = 0; @@ -278,7 +281,11 @@ impl ScheduledIo { drop(waiters); for waker in &mut wakers[..curr] { - unsafe { &mut *waker.as_mut_ptr() }.take().unwrap().wake(); + unsafe { + mem::replace(waker, MaybeUninit::uninit()) + .assume_init() + }.wake() + } } From 2bb9da5b0995dcfa5c57adc47a773471743bf6d8 Mon Sep 17 00:00:00 2001 From: Gleb Pomykalov Date: Mon, 23 Aug 2021 12:04:36 +0300 Subject: [PATCH 03/16] rustfmt --- tokio/src/io/driver/scheduled_io.rs | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/tokio/src/io/driver/scheduled_io.rs b/tokio/src/io/driver/scheduled_io.rs index 9420f7e99fd..80d99427060 100644 --- a/tokio/src/io/driver/scheduled_io.rs +++ b/tokio/src/io/driver/scheduled_io.rs @@ -215,9 +215,8 @@ impl ScheduledIo { fn wake0(&self, ready: Ready, shutdown: bool) { const NUM_WAKERS: usize = 32; - let mut wakers: [MaybeUninit; NUM_WAKERS] = unsafe { - core::mem::MaybeUninit::uninit().assume_init() - }; + let mut wakers: [MaybeUninit; NUM_WAKERS] = + unsafe { core::mem::MaybeUninit::uninit().assume_init() }; let mut curr = 0; @@ -265,10 +264,7 @@ impl ScheduledIo { drop(waiters); for waker in &mut wakers[..curr] { - unsafe { - mem::replace(waker, MaybeUninit::uninit()) - .assume_init() - }.wake() + unsafe { mem::replace(waker, MaybeUninit::uninit()).assume_init() }.wake() } curr = 0; @@ -281,11 +277,7 @@ impl ScheduledIo { drop(waiters); for waker in &mut wakers[..curr] { - unsafe { - mem::replace(waker, MaybeUninit::uninit()) - .assume_init() - }.wake() - + unsafe { mem::replace(waker, MaybeUninit::uninit()).assume_init() }.wake() } } From c0aad94758ae3c9bc71084857d0744cfcff47112 Mon Sep 17 00:00:00 2001 From: Gleb Pomykalov Date: Mon, 23 Aug 2021 13:13:31 +0300 Subject: [PATCH 04/16] implement WakeList to support Drop on it --- tokio/src/io/driver/scheduled_io.rs | 30 +++++-------------- tokio/src/util/mod.rs | 3 ++ tokio/src/util/wake_list.rs | 46 +++++++++++++++++++++++++++++ 3 files changed, 57 insertions(+), 22 deletions(-) create mode 100644 tokio/src/util/wake_list.rs diff --git a/tokio/src/io/driver/scheduled_io.rs b/tokio/src/io/driver/scheduled_io.rs index 80d99427060..a2657203fb5 100644 --- a/tokio/src/io/driver/scheduled_io.rs +++ b/tokio/src/io/driver/scheduled_io.rs @@ -3,7 +3,7 @@ use crate::loom::sync::atomic::AtomicUsize; use crate::loom::sync::Mutex; use crate::util::bit; use crate::util::slab::Entry; -use core::mem::{self, MaybeUninit}; +use crate::util::WakeList; use std::sync::atomic::Ordering::{AcqRel, Acquire, Release}; use std::task::{Context, Poll, Waker}; @@ -213,12 +213,7 @@ impl ScheduledIo { } fn wake0(&self, ready: Ready, shutdown: bool) { - const NUM_WAKERS: usize = 32; - - let mut wakers: [MaybeUninit; NUM_WAKERS] = - unsafe { core::mem::MaybeUninit::uninit().assume_init() }; - - let mut curr = 0; + let mut wakers = WakeList::new(); let mut waiters = self.waiters.lock(); @@ -227,16 +222,14 @@ impl ScheduledIo { // check for AsyncRead slot if ready.is_readable() { if let Some(waker) = waiters.reader.take() { - wakers[curr] = MaybeUninit::new(waker); - curr += 1; + wakers.push(waker); } } // check for AsyncWrite slot if ready.is_writable() { if let Some(waker) = waiters.writer.take() { - wakers[curr] = MaybeUninit::new(waker); - curr += 1; + wakers.push(waker); } } @@ -244,15 +237,14 @@ impl ScheduledIo { 'outer: loop { let mut iter = waiters.list.drain_filter(|w| ready.satisfies(w.interest)); - while curr < NUM_WAKERS { + while wakers.can_push() { match iter.next() { Some(waiter) => { let waiter = unsafe { &mut *waiter.as_ptr() }; if let Some(waker) = waiter.waker.take() { waiter.is_ready = true; - wakers[curr] = MaybeUninit::new(waker); - curr += 1; + wakers.push(waker); } } None => { @@ -263,11 +255,7 @@ impl ScheduledIo { drop(waiters); - for waker in &mut wakers[..curr] { - unsafe { mem::replace(waker, MaybeUninit::uninit()).assume_init() }.wake() - } - - curr = 0; + wakers.wake_all(); // Acquire the lock again. waiters = self.waiters.lock(); @@ -276,9 +264,7 @@ impl ScheduledIo { // Release the lock before notifying drop(waiters); - for waker in &mut wakers[..curr] { - unsafe { mem::replace(waker, MaybeUninit::uninit()).assume_init() }.wake() - } + wakers.wake_all(); } pub(super) fn ready_event(&self, interest: Interest) -> ReadyEvent { diff --git a/tokio/src/util/mod.rs b/tokio/src/util/mod.rs index 9065f50a836..7539e3b121d 100644 --- a/tokio/src/util/mod.rs +++ b/tokio/src/util/mod.rs @@ -27,6 +27,9 @@ cfg_rt! { mod vec_deque_cell; pub(crate) use vec_deque_cell::VecDequeCell; + + mod wake_list; + pub(crate) use wake_list::WakeList; } cfg_rt_multi_thread! { diff --git a/tokio/src/util/wake_list.rs b/tokio/src/util/wake_list.rs new file mode 100644 index 00000000000..f51c678e614 --- /dev/null +++ b/tokio/src/util/wake_list.rs @@ -0,0 +1,46 @@ +use core::mem::{self, MaybeUninit}; +use std::task::Waker; + +const NUM_WAKERS: usize = 32; + +pub(crate) struct WakeList { + inner: [MaybeUninit; NUM_WAKERS], + curr: usize, +} + +impl WakeList { + pub(crate) fn new() -> Self { + Self { + inner: unsafe { MaybeUninit::uninit().assume_init() }, + curr: 0, + } + } + + pub(crate) fn can_push(&self) -> bool { + self.curr < NUM_WAKERS - 1 + } + + pub(crate) fn push(&mut self, val: Waker) -> bool { + if self.curr == NUM_WAKERS - 1 { + return false; + } + self.inner[self.curr] = MaybeUninit::new(val); + self.curr += 1; + true + } + + pub(crate) fn wake_all(&mut self) { + for waker in &mut self.inner[..self.curr] { + unsafe { mem::replace(waker, MaybeUninit::uninit()).assume_init() }.wake() + } + self.curr = 0; + } +} + +impl Drop for WakeList { + fn drop(&mut self) { + for waker in &mut self.inner[..self.curr] { + mem::drop(unsafe { mem::replace(waker, MaybeUninit::uninit()).assume_init() }); + } + } +} From b932ea5fca155c7e021bff153ae228007013255e Mon Sep 17 00:00:00 2001 From: Gleb Pomykalov Date: Mon, 23 Aug 2021 13:24:02 +0300 Subject: [PATCH 05/16] don't return from push --- tokio/src/util/wake_list.rs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/tokio/src/util/wake_list.rs b/tokio/src/util/wake_list.rs index f51c678e614..23558db0923 100644 --- a/tokio/src/util/wake_list.rs +++ b/tokio/src/util/wake_list.rs @@ -20,13 +20,11 @@ impl WakeList { self.curr < NUM_WAKERS - 1 } - pub(crate) fn push(&mut self, val: Waker) -> bool { - if self.curr == NUM_WAKERS - 1 { - return false; - } + pub(crate) fn push(&mut self, val: Waker) { + debug_assert!(self.can_push()); + self.inner[self.curr] = MaybeUninit::new(val); self.curr += 1; - true } pub(crate) fn wake_all(&mut self) { From 03103d86e483e232777db5c31842242953839d4e Mon Sep 17 00:00:00 2001 From: Gleb Pomykalov Date: Mon, 23 Aug 2021 15:22:14 +0300 Subject: [PATCH 06/16] Prevent later dropping of uninitialized Waker if `wake` panics. Co-authored-by: Alice Ryhl --- tokio/src/util/wake_list.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tokio/src/util/wake_list.rs b/tokio/src/util/wake_list.rs index 23558db0923..019e7275920 100644 --- a/tokio/src/util/wake_list.rs +++ b/tokio/src/util/wake_list.rs @@ -28,10 +28,12 @@ impl WakeList { } pub(crate) fn wake_all(&mut self) { - for waker in &mut self.inner[..self.curr] { - unsafe { mem::replace(waker, MaybeUninit::uninit()).assume_init() }.wake() + assert!(self.curr <= NUM_WAKERS); + while self.curr > 0 { + self.curr -= 1; + let waker = unsafe { std::ptr::read(self.inner[self.curr].as_mut_ptr()) }; + waker.wake(); } - self.curr = 0; } } From 9dd73ebee077ca977ae55e94a70c8c939410cc5b Mon Sep 17 00:00:00 2001 From: Gleb Pomykalov Date: Mon, 23 Aug 2021 15:35:44 +0300 Subject: [PATCH 07/16] Fix `can_push` condition - allow usage of the last waker. --- tokio/src/util/wake_list.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tokio/src/util/wake_list.rs b/tokio/src/util/wake_list.rs index 019e7275920..da9773a508f 100644 --- a/tokio/src/util/wake_list.rs +++ b/tokio/src/util/wake_list.rs @@ -16,8 +16,9 @@ impl WakeList { } } + #[inline] pub(crate) fn can_push(&self) -> bool { - self.curr < NUM_WAKERS - 1 + self.curr <= NUM_WAKERS - 1 } pub(crate) fn push(&mut self, val: Waker) { From 0fb5f46aa96b09747358b186035e38746b44590f Mon Sep 17 00:00:00 2001 From: Gleb Pomykalov Date: Mon, 23 Aug 2021 15:45:19 +0300 Subject: [PATCH 08/16] Use slice_from_raw_parts_mut/drop_in_place in WakerList Drop implementation Co-authored-by: Alice Ryhl --- tokio/src/util/wake_list.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tokio/src/util/wake_list.rs b/tokio/src/util/wake_list.rs index da9773a508f..2746550834a 100644 --- a/tokio/src/util/wake_list.rs +++ b/tokio/src/util/wake_list.rs @@ -40,8 +40,7 @@ impl WakeList { impl Drop for WakeList { fn drop(&mut self) { - for waker in &mut self.inner[..self.curr] { - mem::drop(unsafe { mem::replace(waker, MaybeUninit::uninit()).assume_init() }); - } + let slice = std::ptr::slice_from_raw_parts_mut(self.inner.as_mut_ptr() as *mut Waker, self.curr); + unsafe { std::ptr::drop_in_place(slice) }; } } From c7e65e655306acee40abac72497900c9279a1332 Mon Sep 17 00:00:00 2001 From: Gleb Pomykalov Date: Mon, 23 Aug 2021 15:52:42 +0300 Subject: [PATCH 09/16] remove unused import --- tokio/src/util/wake_list.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tokio/src/util/wake_list.rs b/tokio/src/util/wake_list.rs index 2746550834a..7581c8fb5a1 100644 --- a/tokio/src/util/wake_list.rs +++ b/tokio/src/util/wake_list.rs @@ -1,4 +1,4 @@ -use core::mem::{self, MaybeUninit}; +use core::mem::MaybeUninit; use std::task::Waker; const NUM_WAKERS: usize = 32; From 5040110b6205d7c260ed88c498db4f8464cd9e3e Mon Sep 17 00:00:00 2001 From: Gleb Pomykalov Date: Mon, 23 Aug 2021 16:49:30 +0300 Subject: [PATCH 10/16] fmt --- tokio/src/util/wake_list.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tokio/src/util/wake_list.rs b/tokio/src/util/wake_list.rs index 7581c8fb5a1..8e2486c0e1b 100644 --- a/tokio/src/util/wake_list.rs +++ b/tokio/src/util/wake_list.rs @@ -40,7 +40,8 @@ impl WakeList { impl Drop for WakeList { fn drop(&mut self) { - let slice = std::ptr::slice_from_raw_parts_mut(self.inner.as_mut_ptr() as *mut Waker, self.curr); + let slice = + std::ptr::slice_from_raw_parts_mut(self.inner.as_mut_ptr() as *mut Waker, self.curr); unsafe { std::ptr::drop_in_place(slice) }; } } From 7068c3e5b9d268e1d399d35299b977966679a8e5 Mon Sep 17 00:00:00 2001 From: Gleb Pomykalov Date: Mon, 23 Aug 2021 16:56:51 +0300 Subject: [PATCH 11/16] try to fix imports --- tokio/src/util/mod.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tokio/src/util/mod.rs b/tokio/src/util/mod.rs index 7539e3b121d..300e06bc49e 100644 --- a/tokio/src/util/mod.rs +++ b/tokio/src/util/mod.rs @@ -1,6 +1,9 @@ cfg_io_driver! { pub(crate) mod bit; pub(crate) mod slab; + + mod wake_list; + pub(crate) use wake_list::WakeList; } #[cfg(any( @@ -27,9 +30,6 @@ cfg_rt! { mod vec_deque_cell; pub(crate) use vec_deque_cell::VecDequeCell; - - mod wake_list; - pub(crate) use wake_list::WakeList; } cfg_rt_multi_thread! { From 958d43b13dabc63d0afb8932c311df098ae6654b Mon Sep 17 00:00:00 2001 From: Gleb Pomykalov Date: Mon, 23 Aug 2021 16:56:58 +0300 Subject: [PATCH 12/16] clippy --- tokio/src/util/wake_list.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tokio/src/util/wake_list.rs b/tokio/src/util/wake_list.rs index 8e2486c0e1b..6ee24b77ded 100644 --- a/tokio/src/util/wake_list.rs +++ b/tokio/src/util/wake_list.rs @@ -18,7 +18,7 @@ impl WakeList { #[inline] pub(crate) fn can_push(&self) -> bool { - self.curr <= NUM_WAKERS - 1 + self.curr < NUM_WAKERS } pub(crate) fn push(&mut self, val: Waker) { From 7a55899e57c8cb8b768e911c0e05a148dc8fa298 Mon Sep 17 00:00:00 2001 From: Gleb Pomykalov Date: Mon, 23 Aug 2021 21:48:34 +0300 Subject: [PATCH 13/16] import core::ptr --- tokio/src/util/wake_list.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tokio/src/util/wake_list.rs b/tokio/src/util/wake_list.rs index 6ee24b77ded..bd3899563b6 100644 --- a/tokio/src/util/wake_list.rs +++ b/tokio/src/util/wake_list.rs @@ -1,4 +1,5 @@ use core::mem::MaybeUninit; +use core::ptr; use std::task::Waker; const NUM_WAKERS: usize = 32; @@ -32,7 +33,7 @@ impl WakeList { assert!(self.curr <= NUM_WAKERS); while self.curr > 0 { self.curr -= 1; - let waker = unsafe { std::ptr::read(self.inner[self.curr].as_mut_ptr()) }; + let waker = unsafe { ptr::read(self.inner[self.curr].as_mut_ptr()) }; waker.wake(); } } @@ -41,7 +42,7 @@ impl WakeList { impl Drop for WakeList { fn drop(&mut self) { let slice = - std::ptr::slice_from_raw_parts_mut(self.inner.as_mut_ptr() as *mut Waker, self.curr); - unsafe { std::ptr::drop_in_place(slice) }; + ptr::slice_from_raw_parts_mut(self.inner.as_mut_ptr() as *mut Waker, self.curr); + unsafe { ptr::drop_in_place(slice) }; } } From 905dc931d20f10feed7b28ec06c9e481b26d3b8e Mon Sep 17 00:00:00 2001 From: Gleb Pomykalov Date: Mon, 23 Aug 2021 21:53:12 +0300 Subject: [PATCH 14/16] use for loop with rev iterator in wake_all --- tokio/src/util/wake_list.rs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tokio/src/util/wake_list.rs b/tokio/src/util/wake_list.rs index bd3899563b6..f72850b6f78 100644 --- a/tokio/src/util/wake_list.rs +++ b/tokio/src/util/wake_list.rs @@ -30,12 +30,13 @@ impl WakeList { } pub(crate) fn wake_all(&mut self) { - assert!(self.curr <= NUM_WAKERS); - while self.curr > 0 { - self.curr -= 1; - let waker = unsafe { ptr::read(self.inner[self.curr].as_mut_ptr()) }; + debug_assert!(self.curr <= NUM_WAKERS); + + for waker in self.inner[..self.curr].iter_mut().rev() { + let waker = unsafe { std::ptr::read(waker.as_mut_ptr()) }; waker.wake(); } + self.curr = 0; } } From cbdcfd31cba332ffd2c822105101372dd43edac4 Mon Sep 17 00:00:00 2001 From: Gleb Pomykalov Date: Mon, 23 Aug 2021 21:54:21 +0300 Subject: [PATCH 15/16] Revert "use for loop with rev iterator in wake_all" This reverts commit 905dc931d20f10feed7b28ec06c9e481b26d3b8e. --- tokio/src/util/wake_list.rs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/tokio/src/util/wake_list.rs b/tokio/src/util/wake_list.rs index f72850b6f78..bd3899563b6 100644 --- a/tokio/src/util/wake_list.rs +++ b/tokio/src/util/wake_list.rs @@ -30,13 +30,12 @@ impl WakeList { } pub(crate) fn wake_all(&mut self) { - debug_assert!(self.curr <= NUM_WAKERS); - - for waker in self.inner[..self.curr].iter_mut().rev() { - let waker = unsafe { std::ptr::read(waker.as_mut_ptr()) }; + assert!(self.curr <= NUM_WAKERS); + while self.curr > 0 { + self.curr -= 1; + let waker = unsafe { ptr::read(self.inner[self.curr].as_mut_ptr()) }; waker.wake(); } - self.curr = 0; } } From 0267a17a5233404f2a6c99f02cccca852c0f21a0 Mon Sep 17 00:00:00 2001 From: Gleb Pomykalov Date: Tue, 24 Aug 2021 02:34:28 +0300 Subject: [PATCH 16/16] rustfmt --- tokio/src/util/wake_list.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tokio/src/util/wake_list.rs b/tokio/src/util/wake_list.rs index bd3899563b6..2a5268adb56 100644 --- a/tokio/src/util/wake_list.rs +++ b/tokio/src/util/wake_list.rs @@ -41,8 +41,7 @@ impl WakeList { impl Drop for WakeList { fn drop(&mut self) { - let slice = - ptr::slice_from_raw_parts_mut(self.inner.as_mut_ptr() as *mut Waker, self.curr); + let slice = ptr::slice_from_raw_parts_mut(self.inner.as_mut_ptr() as *mut Waker, self.curr); unsafe { ptr::drop_in_place(slice) }; } }