Skip to main content

BatchSemaphore

Struct BatchSemaphore 

Source
pub struct BatchSemaphore { /* private fields */ }
Expand description

Counting semaphore

Implementations§

Source§

impl BatchSemaphore

Source

pub fn new(num_permits: usize, fairness: Fairness) -> Self

Creates a new semaphore with the initial number of permits.

Source

pub fn new_with_signature( num_permits: usize, fairness: Fairness, signature: ResourceSignature, ) -> Self

Source

pub const fn const_new(num_permits: usize, fairness: Fairness) -> Self

Creates a new semaphore with the initial number of permits.

Source

pub const fn const_new_with_signature( num_permits: usize, fairness: Fairness, signature: ResourceSignature, ) -> Self

Source

pub fn available_permits(&self) -> usize

Returns the current number of available permits.

Source

pub fn close(&self)

Closes the semaphore. This prevents the semaphore from issuing new permits and notifies all pending waiters.

Source

pub fn close_no_scheduling_point(&self)

Closes the semaphore without invoking thread::switch

Source

pub fn is_closed(&self) -> bool

Returns true iff the semaphore is closed.

Source

pub fn try_acquire(&self, num_permits: usize) -> Result<(), TryAcquireError>

Try to acquire the specified number of permits from the Semaphore. If the permits are available, returns Ok(()) If the semaphore is closed, returns Err(TryAcquireError::Closed) If there aren’t enough permits, returns Err(TryAcquireError::NoPermits)

Source

pub fn acquire(&self, num_permits: usize) -> Acquire<'_> ⓘ

Acquire the specified number of permits (async API)

Source

pub fn acquire_blocking(&self, num_permits: usize) -> Result<(), AcquireError>

Acquire the specified number of permits (blocking API)

Source

pub fn release(&self, num_permits: usize)

Release num_permits back to the Semaphore

Source

pub fn upgrade( &self, permits_currently_held: usize, permits_to_be_held: usize, ) -> Acquire<'_> ⓘ

Atomically upgrade from holding permits_currently_held permits to holding permits_to_be_held, without ever dropping below permits_currently_held in between. The motivating use case is parking_lot’s RwLockUpgradableReadGuard::upgrade, which must take a read guard to a write guard without letting any writer in along the way.

This is implemented by acquiring only the missing permits (permits_to_be_held - permits_currently_held), with priority over any waiter already queued, so that the request overtakes the queue. Both halves of that matter:

  • Keeping the held permits means no other task can claim the resource mid-upgrade. Releasing them first (even for an instant) would hand the resource to a queued waiter, which for an RwLock means a writer mutating the data an upgradable reader had already observed.
  • Overtaking the queue is what makes that safe rather than deadlock-prone. Since we hold permits we will not release, a queued waiter ahead of us may be unsatisfiable (an RwLock writer wants all permits), so waiting our turn behind it could deadlock. Queued waiters hold no permits, so overtaking them costs nothing but their place in line – which is exactly the priority a real upgradable read lock gives an upgrade.

The upgrade therefore blocks only on tasks that currently hold permits, and is granted as soon as they release. The returned future must be driven to completion; if it is dropped first, the caller still holds permits_currently_held.

At most one upgrade may be in flight on a semaphore at a time. Two concurrent upgraders could each be waiting for permits the other holds, which no queue discipline can resolve. Callers are expected to enforce this (an RwLock does: there is only ever one upgradable reader).

Source

pub fn try_upgrade( &self, permits_currently_held: usize, permits_to_be_held: usize, ) -> Result<(), TryAcquireError>

The non-blocking analogue of BatchSemaphore::upgrade: succeeds only if the missing permits are available right now, and never blocks or queues.

Like upgrade, this ignores queued waiters (they hold no permits, so they cannot be the reason the upgrade is short of permits). A try_upgrade therefore fails only when some other task actually holds permits the upgrade needs.

Source§

impl BatchSemaphore

Source

pub fn signature(&self) -> &ResourceSignature

Returns a reference to this semaphore’s resource signature.

Trait Implementations§

Source§

impl Debug for BatchSemaphore

Source§

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

Formats the value using the given formatter. Read more
Source§

impl Default for BatchSemaphore

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl Send for BatchSemaphore

Source§

impl Sync for BatchSemaphore

Source§

impl WithName for &BatchSemaphore

Source§

fn with_name_and_kind(self, name: Option<&str>, kind: Option<&str>) -> Self

Set the name and kind (full type path) of this object.
Source§

fn with_name(self, name: &str) -> Self
where Self: Sized,

Set the name of this object.
Source§

fn with_kind(self, kind: &str) -> Self
where Self: Sized,

Set the kind (full type path) of this object.
Source§

impl WithName for BatchSemaphore

Source§

fn with_name_and_kind(self, name: Option<&str>, kind: Option<&str>) -> Self

Set the name and kind (full type path) of this object.
Source§

fn with_name(self, name: &str) -> Self
where Self: Sized,

Set the name of this object.
Source§

fn with_kind(self, kind: &str) -> Self
where Self: Sized,

Set the kind (full type path) of this object.

Auto Trait Implementations§

Blanket Implementations§

Source§

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

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

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

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

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

Source§

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

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> Conv for T

Source§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
Source§

impl<T> FmtForward for T

Source§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
Source§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
Source§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
Source§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
Source§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
Source§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
Source§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
Source§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
Source§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

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

Source§

fn into(self) -> U

Calls U::from(self).

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

Source§

impl<T> Pipe for T
where T: ?Sized,

Source§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
Source§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
Source§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
Source§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
Source§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
Source§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
Source§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Tap for T

Source§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
Source§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
Source§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
Source§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
Source§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
Source§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
Source§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
Source§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
Source§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
Source§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
Source§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
Source§

impl<T> TryConv for T

Source§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

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

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

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

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

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

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more