From 43a88fa06b65baf1fc81428b7b5d95869d9424ee Mon Sep 17 00:00:00 2001 From: Mnwa Date: Sat, 5 Sep 2020 16:53:24 +0300 Subject: [PATCH] change waker getter --- src/mutex.rs | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/mutex.rs b/src/mutex.rs index f1c712c..c36e3fb 100644 --- a/src/mutex.rs +++ b/src/mutex.rs @@ -128,7 +128,7 @@ impl<'a, T: ?Sized> Future for MutexGuardFuture<'a, T> { if Some(current) == self.id.checked_sub(1) { let _ = self.mutex.waker.compare_exchange_weak( null_mut(), - get_waker_ptr(cx.waker()), + Box::into_raw(Box::new(cx.waker().clone())), Ordering::AcqRel, Ordering::Acquire, ); @@ -152,7 +152,7 @@ impl Future for MutexOwnedGuardFuture { if Some(current) == self.id.checked_sub(1) { let _ = self.mutex.waker.compare_exchange_weak( null_mut(), - get_waker_ptr(cx.waker()), + Box::into_raw(Box::new(cx.waker().clone())), Ordering::AcqRel, Ordering::Acquire, ); @@ -163,12 +163,6 @@ impl Future for MutexOwnedGuardFuture { } } -#[inline(always)] -fn get_waker_ptr(waker: &Waker) -> *mut Waker { - let waker = waker.clone(); - Box::into_raw(Box::new(waker)) -} - impl Deref for MutexGuard<'_, T> { type Target = T; @@ -233,13 +227,13 @@ impl Drop for MutexOwnedGuardFuture { } } -#[inline(always)] +#[inline] fn wake_ptr(waker_ptr: &AtomicPtr) { - let waker_ptr = waker_ptr.swap(null_mut(), Ordering::AcqRel); - - unsafe { - if let Some(waker) = waker_ptr.as_ref() { - waker.wake_by_ref(); + if let Err(waker_ptr) = + waker_ptr.compare_exchange_weak(null_mut(), null_mut(), Ordering::AcqRel, Ordering::Acquire) + { + unsafe { + (*waker_ptr).wake_by_ref(); waker_ptr.drop_in_place(); } }