diff --git a/src/transfer/internal.rs b/src/transfer/internal.rs index dd778f7..44cfe1d 100644 --- a/src/transfer/internal.rs +++ b/src/transfer/internal.rs @@ -2,7 +2,10 @@ use std::{ cell::UnsafeCell, ffi::c_void, ptr::NonNull, - sync::atomic::{AtomicU8, Ordering}, + sync::{ + atomic::{AtomicU8, Ordering}, + Arc, + }, task::{Context, Poll}, }; @@ -44,7 +47,7 @@ struct TransferInner { state: AtomicU8, /// Waker that is notified when transfer completes. - waker: AtomicWaker, + waker: Arc, } /// Handle to a transfer. @@ -81,7 +84,7 @@ impl TransferHandle

{ let b = Box::new(TransferInner { platform_data: UnsafeCell::new(inner), state: AtomicU8::new(STATE_IDLE), - waker: AtomicWaker::new(), + waker: Arc::new(AtomicWaker::new()), }); TransferHandle { @@ -180,13 +183,9 @@ impl Drop for TransferHandle

{ pub(crate) unsafe fn notify_completion(transfer: *mut c_void) { unsafe { let transfer = transfer as *mut TransferInner

; - let waker = (*transfer).waker.take(); + let waker = (*transfer).waker.clone(); match (*transfer).state.swap(STATE_COMPLETED, Ordering::Release) { - STATE_PENDING => { - if let Some(waker) = waker { - waker.wake() - } - } + STATE_PENDING => waker.wake(), STATE_ABANDONED => { drop(Box::from_raw(transfer)); }