Struct OwnedPermit
pub struct OwnedPermit<T> { /* private fields */ }
sync only.Owned permit to send one value into the channel.
This is identical to the Permit type, except that it moves the sender rather than borrowing it.
OwnedPermit values are returned by Sender::reserve_owned() and Sender::try_reserve_owned() and are used to guarantee channel capacity before generating a message to send.
Implementations
impl<T> OwnedPermit<T>
pub fn send(self, value: T) -> Sender<T>
Sends a value using the reserved capacity.
Capacity for the message has already been reserved. The message is sent to the receiver and the permit is consumed. The operation will succeed even if the receiver half has been closed. See Receiver::close for more details on performing a clean shutdown.
Unlike Permit::send, this method returns the Sender from which the OwnedPermit was reserved.
Examples
use tokio::sync::mpsc;
let (tx, mut rx) = mpsc::channel(1);
// Reserve capacity
let permit = tx.reserve_owned().await.unwrap();
// Send a message on the permit, returning the sender.
let tx = permit.send(456);
// The value sent on the permit is received
assert_eq!(rx.recv().await.unwrap(), 456);
// We may now reuse `tx` to send another message.
tx.send(789).await.unwrap();pub fn release(self) -> Sender<T>
Releases the reserved capacity without sending a message, returning the Sender.
Examples
use tokio::sync::mpsc;
let (tx, rx) = mpsc::channel(1);
// Clone the sender and reserve capacity
let permit = tx.clone().reserve_owned().await.unwrap();
// Trying to send on the original `tx` will fail, since the `permit`
// has reserved all the available capacity.
assert!(tx.try_send(123).is_err());
// Release the permit without sending a message, returning the clone
// of the sender.
let tx2 = permit.release();
// We may now reuse `tx` to send another message.
tx.send(789).await.unwrap();pub fn same_channel(&self, other: &Self) -> bool
Returns true if permits belong to the same channel.
Examples
use tokio::sync::mpsc;
let (tx, rx) = mpsc::channel::<()>(2);
let permit1 = tx.clone().reserve_owned().await.unwrap();
let permit2 = tx.clone().reserve_owned().await.unwrap();
assert!(permit1.same_channel(&permit2));
let (tx2, rx2) = mpsc::channel::<()>(1);
let permit3 = tx2.clone().reserve_owned().await.unwrap();
assert!(!permit3.same_channel(&permit2));pub fn same_channel_as_sender(&self, sender: &Sender<T>) -> bool
Returns true if this permit belongs to the same channel as the given Sender.
Examples
use tokio::sync::mpsc;
let (tx, rx) = mpsc::channel::<()>(1);
let permit = tx.clone().reserve_owned().await.unwrap();
assert!(permit.same_channel_as_sender(&tx));
let (tx2, rx2) = mpsc::channel::<()>(1);
assert!(!permit.same_channel_as_sender(&tx2));Trait Implementations
impl<T> Debug for OwnedPermit<T>
impl<T> Drop for OwnedPermit<T>
Auto Trait Implementations
impl<T> Freeze for OwnedPermit<T>
impl<T> RefUnwindSafe for OwnedPermit<T>
impl<T> Send for OwnedPermit<T>where T: Send,
impl<T> Sync for OwnedPermit<T>where T: Send,
impl<T> Unpin for OwnedPermit<T>
impl<T> UnsafeUnpin for OwnedPermit<T>
impl<T> UnwindSafe for OwnedPermit<T>
Blanket Implementations
impl<T> BorrowMut<T> for Twhere T: ?Sized,
fn borrow_mut(&mut self) -> &mut T
impl<T> Instrument for T
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
impl<T> WithSubscriber for T
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ
MIT License
Copyright © Tokio Contributors
https://docs.rs/tokio/1.53.1/tokio/sync/mpsc/struct.OwnedPermit.html