pub struct OwnedPermit<T> { /* private fields */ }
Expand description
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§
Source§impl<T> OwnedPermit<T>
impl<T> OwnedPermit<T>
Sourcepub fn send(self, value: T) -> Sender<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;
#[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();
}
Sourcepub fn release(self) -> Sender<T>
pub fn release(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();
}
Sourcepub fn same_channel(&self, other: &Self) -> bool
pub fn same_channel(&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));
}
Sourcepub fn same_channel_as_sender(&self, sender: &Sender<T>) -> bool
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;
#[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));
}