Skip to main content

AdjustableSemaphore

Struct AdjustableSemaphore 

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

An adjustable semaphore in which the total number of permits can be adjusted at any time between a minimum and a maximum bound.

Unlike the tokio Semaphore, decreasing the number of permits may be done at any time and are resolved lazily if needed; any permits currently issued remain valid, but no new permits are issued until any requested decreases are resolved.

When max_permits exceeds the platform semaphore limit, a scaling basis is automatically computed so that all permit operations are transparently mapped to a smaller number of internal permits. On 64-bit platforms the basis is 1 for any practical permit count.

Implementations§

Source§

impl AdjustableSemaphore

Source

pub fn new(initial_permits: u64, permit_range: (u64, u64)) -> Arc<Self>

Source

pub fn total_permits(&self) -> u64

Source

pub fn available_permits(&self) -> u64

Source

pub fn active_permits(&self) -> u64

Source

pub fn basis(&self) -> u64

The scaling basis. Each internal permit represents this many logical permits. On 64-bit platforms this is 1 for any practical permit count.

Source

pub async fn acquire( self: &Arc<Self>, ) -> Result<AdjustableSemaphorePermit, AcquireError>

Acquire a single permit.

Source

pub async fn acquire_many( self: &Arc<Self>, n: u64, ) -> Result<AdjustableSemaphorePermit, AcquireError>

Acquire n logical permits. The request is scaled and clamped to the total permit count so that a single acquire can always succeed once enough permits are freed.

Source

pub fn decrement_total_permits(&self, n: u64) -> Option<u64>

Decrement the total number of permits by up to n (logical) down to the minimum bound. Note that this does not affect any permits currently issued; in the case where all permits are currently issued, no new permits will be issued until the adjustment has been resolved.

Returns the logical amount decreased, or None if no adjustment occurred.

Source

pub fn decrement_permits_to_target(&self, target: u64) -> Option<u64>

Adjust total permits downward to target (logical) if the current total is above it. Returns the logical amount that was requested to be decreased, or None if no adjustment was needed.

Acquires an internal lock to serialize with other target-based adjustments, preventing read-then-modify races. The underlying decrement_total_permits handles clamping at the minimum bound.

Source

pub fn increment_total_permits( self: &Arc<Self>, n: u64, ) -> Option<AdjustableSemaphorePermit>

Increment the total number of permits by up to n (logical) up to the maximum bound.

Returns a permit holding the newly added capacity, or None if no permits could be added (already at max). The permits enter the semaphore when the returned permit is dropped. This allows a user to acquire a permit immediately that bypasses the FIFO queue so the caller can hold them without contention. If the returned permit is dropped immediately, then this simply increments the available permits in the semaphore.

Source

pub fn increment_permits_to_target( self: &Arc<Self>, target: u64, ) -> Option<AdjustableSemaphorePermit>

Adjust total permits upward to target (logical) if the current total is below it. Returns a virtual permit holding the increase, or None if no adjustment was needed or possible.

Acquires an internal lock to serialize with other target-based adjustments, preventing read-then-modify races. The underlying increment_total_permits handles clamping at the maximum bound.

Trait Implementations§

Source§

impl Debug for AdjustableSemaphore

Source§

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

Formats the value using the given formatter. Read more

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<T> DropFlavorWrapper<T> for T

Source§

type Flavor = MayDrop

The DropFlavor that wraps T into Self
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, W> HasTypeWitness<W> for T
where W: MakeTypeWitness<Arg = T>, T: ?Sized,

Source§

const WITNESS: W = W::MAKE

A constant of the type witness
Source§

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

Source§

const TYPE_EQ: TypeEq<T, <T as Identity>::Type> = TypeEq::NEW

Proof that Self is the same type as Self::Type, provides methods for casting between Self and Self::Type.
Source§

type Type = T

The same type as Self, used to emulate type equality bounds (T == U) with associated type equality constraints (T: Identity<Type = U>).
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> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

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

Source§

type Error = Infallible

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

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

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
Source§

impl<E> ResultError for E
where E: Send + Debug + Sync,