Struct OwnedPermit

struct OwnedPermit<T> { ... }

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: 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]
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: Self) -> Sender<T>

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

Examples

use tokio::sync::mpsc;

#[tokio::main]
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: &Self, other: &Self) -> bool

Returns true if permits belong to the same channel.

Examples

use tokio::sync::mpsc;

#[tokio::main]
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: &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]
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));
}

impl<T> Any for OwnedPermit<T>

fn type_id(self: &Self) -> TypeId

impl<T> Borrow for OwnedPermit<T>

fn borrow(self: &Self) -> &T

impl<T> BorrowMut for OwnedPermit<T>

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

impl<T> Debug for OwnedPermit<T>

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

impl<T> Drop for OwnedPermit<T>

fn drop(self: &mut Self)

impl<T> Freeze for OwnedPermit<T>

impl<T> From for OwnedPermit<T>

fn from(t: T) -> T

Returns the argument unchanged.

impl<T> RefUnwindSafe for OwnedPermit<T>

impl<T> Send for OwnedPermit<T>

impl<T> Sync for OwnedPermit<T>

impl<T> Unpin for OwnedPermit<T>

impl<T> UnsafeUnpin for OwnedPermit<T>

impl<T> UnwindSafe for OwnedPermit<T>

impl<T, U> Into for OwnedPermit<T>

fn into(self: 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 for OwnedPermit<T>

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

impl<T, U> TryInto for OwnedPermit<T>

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