1 use std::cell::RefCell; 2 use std::task::Waker; 3 4 pub(crate) struct Defer { 5 deferred: RefCell<Vec<Waker>>, 6 } 7 8 impl Defer { new() -> Defer9 pub(crate) fn new() -> Defer { 10 Defer { 11 deferred: RefCell::default(), 12 } 13 } 14 defer(&self, waker: &Waker)15 pub(crate) fn defer(&self, waker: &Waker) { 16 let mut deferred = self.deferred.borrow_mut(); 17 18 // If the same task adds itself a bunch of times, then only add it once. 19 if let Some(last) = deferred.last() { 20 if last.will_wake(waker) { 21 return; 22 } 23 } 24 25 deferred.push(waker.clone()); 26 } 27 is_empty(&self) -> bool28 pub(crate) fn is_empty(&self) -> bool { 29 self.deferred.borrow().is_empty() 30 } 31 wake(&self)32 pub(crate) fn wake(&self) { 33 while let Some(waker) = self.deferred.borrow_mut().pop() { 34 waker.wake(); 35 } 36 } 37 38 #[cfg(tokio_taskdump)] take_deferred(&self) -> Vec<Waker>39 pub(crate) fn take_deferred(&self) -> Vec<Waker> { 40 let mut deferred = self.deferred.borrow_mut(); 41 std::mem::take(&mut *deferred) 42 } 43 } 44