Struct OwnedSemaphorePermit

#[must_use]
pub struct OwnedSemaphorePermit { /* private fields */ }

An owned permit from the semaphore.

This type is created by the acquire_owned method.

Implementations

impl OwnedSemaphorePermit

fn forget(self)

Forgets the permit without releasing it back to the semaphore. This can be used to reduce the amount of permits available from a semaphore.

Examples

use std::sync::Arc;
use tokio::sync::Semaphore;

let sem = Arc::new(Semaphore::new(10));
{
    let permit = sem.clone().try_acquire_many_owned(5).unwrap();
    assert_eq!(sem.available_permits(), 5);
    permit.forget();
}

// Since we forgot the permit, available permits won't go back to its initial value
// even after the permit is dropped.
assert_eq!(sem.available_permits(), 5);
fn merge(&mut self, other: Self)

Merge two OwnedSemaphorePermit instances together, consuming other without releasing the permits it holds.

Permits held by both self and other are released when self drops.

Panics

This function panics if permits from different Semaphore instances are merged.

Examples

use std::sync::Arc;
use tokio::sync::Semaphore;

let sem = Arc::new(Semaphore::new(10));
let mut permit = sem.clone().try_acquire_owned().unwrap();

for _ in 0..9 {
    let _permit = sem.clone().try_acquire_owned().unwrap();
    // Merge individual permits into a single one.
    permit.merge(_permit)
}

assert_eq!(sem.available_permits(), 0);

// Release all permits in a single batch.
drop(permit);

assert_eq!(sem.available_permits(), 10);
fn split(&mut self, n: usize) -> Option<Self>

Splits n permits from self and returns a new OwnedSemaphorePermit instance that holds n permits.

If there are insufficient permits and it's not possible to reduce by n, returns None.

Note

It will clone the owned Arc<Semaphore> to construct the new instance.

Examples

use std::sync::Arc;
use tokio::sync::Semaphore;

let sem = Arc::new(Semaphore::new(3));

let mut p1 = sem.try_acquire_many_owned(3).unwrap();
let p2 = p1.split(1).unwrap();

assert_eq!(p1.num_permits(), 2);
assert_eq!(p2.num_permits(), 1);
fn semaphore(&self) -> &Arc<Semaphore>

Returns the Semaphore from which this permit was acquired.

fn num_permits(&self) -> usize

Returns the number of permits held by self.

Trait Implementations

impl Debug for OwnedSemaphorePermit

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

impl Drop for OwnedSemaphorePermit

fn drop(&mut self)

Auto Trait Implementations

impl !RefUnwindSafe for OwnedSemaphorePermit

impl !UnwindSafe for OwnedSemaphorePermit

impl Freeze for OwnedSemaphorePermit

impl Send for OwnedSemaphorePermit

impl Sync for OwnedSemaphorePermit

impl Unpin for OwnedSemaphorePermit

impl UnsafeUnpin for OwnedSemaphorePermit

Blanket Implementations

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

fn type_id(&self) -> TypeId

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

fn borrow(&self) -> &T

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

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

impl<T> From<T> for OwnedSemaphorePermit

fn from(t: T) -> T

Returns the argument unchanged.

impl<T, U> Into<U> for OwnedSemaphorePermit 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 OwnedSemaphorePermit where U: Into<T>,

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

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

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