Struct OwnedPermit

pub struct OwnedPermit<T> { /* private fields */ }

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>

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;

# #[tokio::main(flavor = "current_thread")]
# async fn main() {
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();
# }
fn release(self) -> Sender<T>

Releases the reserved capacity without sending a message, returning the Sender.

Examples

use tokio::sync::mpsc;

# #[tokio::main(flavor = "current_thread")]
# async fn main() {
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();
# drop(rx); drop(tx2);
# }
fn same_channel(&self, other: &Self) -> bool

Returns true if permits belong to the same channel.

Examples

use tokio::sync::mpsc;

# #[tokio::main(flavor = "current_thread")]
# async fn main() {
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));
# }
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;

# #[tokio::main(flavor = "current_thread")]
# async fn main() {
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>

fn fmt(&self, fmt: &mut Formatter<'_>) -> Result

impl<T> Drop for OwnedPermit<T>

fn drop(&mut self)

Auto Trait Implementations

impl<T> Freeze for OwnedPermit<T> where Option<Tx<T, Semaphore>>: Freeze,

impl<T> RefUnwindSafe for OwnedPermit<T> where Option<Tx<T, Semaphore>>: RefUnwindSafe,

impl<T> Send for OwnedPermit<T> where Option<Tx<T, Semaphore>>: Send,

impl<T> Sync for OwnedPermit<T> where Option<Tx<T, Semaphore>>: Sync,

impl<T> Unpin for OwnedPermit<T> where Option<Tx<T, Semaphore>>: Unpin,

impl<T> UnsafeUnpin for OwnedPermit<T> where Option<Tx<T, Semaphore>>: UnsafeUnpin,

impl<T> UnwindSafe for OwnedPermit<T> where Option<Tx<T, Semaphore>>: UnwindSafe,

Blanket Implementations

impl<T> Any for OwnedPermit<T> where T: 'static + ?Sized,

fn type_id(&self) -> TypeId

impl<T> Borrow<T> for OwnedPermit<T> where T: ?Sized,

fn borrow(&self) -> &T

impl<T> BorrowMut<T> for OwnedPermit<T> where T: ?Sized,

fn borrow_mut(&mut self) -> &mut T

impl<T> From<T> for OwnedPermit<T>

fn from(t: T) -> T

Returns the argument unchanged.

impl<T, U> Into<U> for OwnedPermit<T> where U: From<T>,

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of [From]<T> for U chooses to do.

impl<T, U> TryFrom<U> for OwnedPermit<T> where U: Into<T>,

type Error = never;
fn try_from(value: U) -> Result<T, never>

impl<T, U> TryInto<U> for OwnedPermit<T> where U: TryFrom<T>,

type Error = <U as TryFrom<T>>::Error;
fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>