sync: remove underused internal Borrow wrapper (#3363)

This commit is contained in:
John-John Tedro 2021-01-01 22:04:38 +01:00 committed by GitHub
parent 36918e05e5
commit 53707f5d9d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -361,38 +361,16 @@ struct RecvGuard<'a, T> {
} }
/// Receive a value future /// Receive a value future
struct Recv<R, T> struct Recv<'a, T> {
where
R: AsMut<Receiver<T>>,
{
/// Receiver being waited on /// Receiver being waited on
receiver: R, receiver: &'a mut Receiver<T>,
/// Entry in the waiter `LinkedList` /// Entry in the waiter `LinkedList`
waiter: UnsafeCell<Waiter>, waiter: UnsafeCell<Waiter>,
_p: std::marker::PhantomData<T>,
} }
/// `AsMut<T>` is not implemented for `T` (coherence). Explicitly implementing unsafe impl<'a, T: Send> Send for Recv<'a, T> {}
/// `AsMut` for `Receiver` would be included in the public API of the receiver unsafe impl<'a, T: Send> Sync for Recv<'a, T> {}
/// type. Instead, `Borrow` is used internally to bridge the gap.
struct Borrow<T>(T);
impl<T> AsMut<Receiver<T>> for Borrow<Receiver<T>> {
fn as_mut(&mut self) -> &mut Receiver<T> {
&mut self.0
}
}
impl<'a, T> AsMut<Receiver<T>> for Borrow<&'a mut Receiver<T>> {
fn as_mut(&mut self) -> &mut Receiver<T> {
&mut *self.0
}
}
unsafe impl<R: AsMut<Receiver<T>> + Send, T: Send> Send for Recv<R, T> {}
unsafe impl<R: AsMut<Receiver<T>> + Sync, T: Send> Sync for Recv<R, T> {}
/// Max number of receivers. Reserve space to lock. /// Max number of receivers. Reserve space to lock.
const MAX_RECEIVERS: usize = usize::MAX >> 2; const MAX_RECEIVERS: usize = usize::MAX >> 2;
@ -892,7 +870,7 @@ impl<T: Clone> Receiver<T> {
/// } /// }
/// ``` /// ```
pub async fn recv(&mut self) -> Result<T, RecvError> { pub async fn recv(&mut self) -> Result<T, RecvError> {
let fut = Recv::<_, T>::new(Borrow(self)); let fut = Recv::new(self);
fut.await fut.await
} }
@ -965,11 +943,8 @@ impl<T> Drop for Receiver<T> {
} }
} }
impl<R, T> Recv<R, T> impl<'a, T> Recv<'a, T> {
where fn new(receiver: &'a mut Receiver<T>) -> Recv<'a, T> {
R: AsMut<Receiver<T>>,
{
fn new(receiver: R) -> Recv<R, T> {
Recv { Recv {
receiver, receiver,
waiter: UnsafeCell::new(Waiter { waiter: UnsafeCell::new(Waiter {
@ -978,7 +953,6 @@ where
pointers: linked_list::Pointers::new(), pointers: linked_list::Pointers::new(),
_p: PhantomPinned, _p: PhantomPinned,
}), }),
_p: std::marker::PhantomData,
} }
} }
@ -990,14 +964,13 @@ where
is_unpin::<&mut Receiver<T>>(); is_unpin::<&mut Receiver<T>>();
let me = self.get_unchecked_mut(); let me = self.get_unchecked_mut();
(me.receiver.as_mut(), &me.waiter) (me.receiver, &me.waiter)
} }
} }
} }
impl<R, T> Future for Recv<R, T> impl<'a, T> Future for Recv<'a, T>
where where
R: AsMut<Receiver<T>>,
T: Clone, T: Clone,
{ {
type Output = Result<T, RecvError>; type Output = Result<T, RecvError>;
@ -1016,14 +989,11 @@ where
} }
} }
impl<R, T> Drop for Recv<R, T> impl<'a, T> Drop for Recv<'a, T> {
where
R: AsMut<Receiver<T>>,
{
fn drop(&mut self) { fn drop(&mut self) {
// Acquire the tail lock. This is required for safety before accessing // Acquire the tail lock. This is required for safety before accessing
// the waiter node. // the waiter node.
let mut tail = self.receiver.as_mut().shared.tail.lock(); let mut tail = self.receiver.shared.tail.lock();
// safety: tail lock is held // safety: tail lock is held
let queued = self.waiter.with(|ptr| unsafe { (*ptr).queued }); let queued = self.waiter.with(|ptr| unsafe { (*ptr).queued });