Skip to main content

BandwidthAcquirer

Struct BandwidthAcquirer 

Source
pub struct BandwidthAcquirer {
    waiter: Arc<RefillWaiter>,
    in_flight: bool,
    pool: BandwidthPool,
}
Expand description

A reusable bandwidth acquirer that is designed for an async context (poll).

The main entry point is Self::poll_acquire used within the context of a task which, if rate limited, the task gets woken up when the bandwidth usage is granted.

Fields§

§waiter: Arc<RefillWaiter>

The shared waiter. Reused for every acquire.

§in_flight: bool

Whether this acquirer currently has a request enqueued with the refiller.

Prevent multi poll to avoid queuing a duplicate request with a different waker.

§pool: BandwidthPool

The bandwidth pool attached to this acquirer.

Implementations§

Source§

impl BandwidthAcquirer

Source

fn new(pool: BandwidthPool) -> Self

Create a reusable BandwidthAcquirer for the given pool.

This is the only allocation an acquirer makes. It can only be called from BandwidthPool::new_acquirer.

The number of tokens to acquire is chosen per Self::poll_acquire call.

Source

fn grant_permit(&mut self) -> Permit

Build the Permit.

This sets the in-flight to false and takes the granted tokens out of the waiter, resetting it, as we now hand them to the permit.

Source

pub fn poll_acquire( &mut self, cx: &mut Context<'_>, tokens: u64, ) -> Poll<Result<Permit, BwPoolError>>

Poll to take tokens tokens from the pool, async waiting if the pool is dry.

The number of tokens is per call so the same acquirer can request a different amount each time.

If the request is in flight, the tokens argument is ignored and the originally requested amount is used. Only when a Permit is emitted that a new tokens value can be used.

A request above the pool capacity is clamped to it rather than refused. The emitted Permit then holds less than what was asked and so the caller must use Permit::granted rather than assume it got tokens.

Returns a BwPoolError::PoolClosed error if the BandwidthRefiller has been dropped.

Source

fn enqueue_request( &mut self, cx: &mut Context<'_>, tokens: u64, ) -> Result<(), BwPoolError>

Enqueue a request for tokens tokens that is NOT in flight.

The amount is sent as it was asked. Clamping it to the pool capacity is the refiller’s job as it is the one holding the tokens by the time this is served. The clamping is localized to the refiller for correctness.

Return a BwPoolError::PoolClosed error if the refiller is gone.

Trait Implementations§

Source§

impl Debug for BandwidthAcquirer

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<'a, T, E> AsTaggedExplicit<'a, E> for T
where T: 'a,

Source§

fn explicit(self, class: Class, tag: u32) -> TaggedParser<'a, Explicit, Self, E>

Source§

impl<'a, T, E> AsTaggedImplicit<'a, E> for T
where T: 'a,

Source§

fn implicit( self, class: Class, constructed: bool, tag: u32, ) -> TaggedParser<'a, Implicit, Self, E>

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

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

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

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
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