pub struct SemaphoreGuard<'a> { /* private fields */ }
Expand description
A guard returned by Semaphore::acquire
that will call Semaphore::release
when it
is dropped (falls out of scope).
§Examples
use async_weighted_semaphore::{Semaphore, SemaphoreGuard};
let semaphore = Semaphore::new(1);
let guard: SemaphoreGuard = semaphore.acquire(1).await.unwrap();
Implementations§
Source§impl<'a> SemaphoreGuard<'a>
impl<'a> SemaphoreGuard<'a>
pub fn new(semaphore: &'a Semaphore, amount: usize) -> Self
Sourcepub fn extend(&mut self, other: SemaphoreGuard<'a>)
pub fn extend(&mut self, other: SemaphoreGuard<'a>)
Combine two SemaphoreGuard
s into one, with the sum of the originals’ permits.
§Examples
let semaphore = Semaphore::new(15);
let mut g1 = semaphore.acquire(10).await.unwrap();
let g2 = semaphore.acquire(5).await.unwrap();
g1.extend(g2);
Sourcepub fn forget(self) -> usize
pub fn forget(self) -> usize
Drop the guard without calling Semaphore::release
. This is useful when release
s don’t
correspond one-to-one with acquires
or it’s difficult to send the guard to the releaser.
§Examples
use async_channel::{Sender, SendError};
// Limit size of a producer-consumer queue. Receivers may wait for any number of items
// to be available.
async fn send<T>(semaphore: &Semaphore,
sender: &Sender<T>,
message: T
) -> Result<(), SendError<T>>{
match semaphore.acquire(1).await {
// A semaphore can be poisoned to prevent deadlock when a channel closes.
Err(PoisonError) => Err(SendError(message)),
Ok(guard) => {
sender.send(message).await?;
guard.forget();
Ok(())
}
}
}
Sourcepub fn split(
&mut self,
permits: usize,
) -> Result<SemaphoreGuard<'a>, SemaphoreGuardSplitErr>
pub fn split( &mut self, permits: usize, ) -> Result<SemaphoreGuard<'a>, SemaphoreGuardSplitErr>
Split this SemaphoreGuard
into two.
The new guard will have permits
permits, and this guard’s permits will be reduced
accordingly.
§Examples
let semaphore = Semaphore::new(15);
let mut g1 = semaphore.acquire(15).await.unwrap();
let g2 = g1.split(5).unwrap();
Trait Implementations§
Source§impl<'a> Debug for SemaphoreGuard<'a>
impl<'a> Debug for SemaphoreGuard<'a>
Auto Trait Implementations§
impl<'a> Freeze for SemaphoreGuard<'a>
impl<'a> RefUnwindSafe for SemaphoreGuard<'a>
impl<'a> Send for SemaphoreGuard<'a>
impl<'a> Sync for SemaphoreGuard<'a>
impl<'a> Unpin for SemaphoreGuard<'a>
impl<'a> UnwindSafe for SemaphoreGuard<'a>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more