mirror of
https://github.com/tokio-rs/tokio.git
synced 2025-09-25 12:00:35 +00:00
sync: remove underused internal Borrow wrapper (#3363)
This commit is contained in:
parent
36918e05e5
commit
53707f5d9d
@ -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 });
|
||||||
|
Loading…
x
Reference in New Issue
Block a user