Struct GenericPool

Source
pub struct GenericPool<T: Poolable + Clone> { /* private fields */ }
Expand description

Generic high-performance object pool optimized for HFT latency requirements

Provides sub-microsecond object borrowing/returning through pre-allocation and recycling. Uses parking_lot::RwLock for thread safety with read-optimized concurrency patterns.

§Design Trade-offs

  • RwLock vs Lock-free: RwLock chosen for simplicity and good read concurrency
  • SmallVec optimization: Stack allocation for small pools, heap expansion when needed
  • Generic constraints: Poolable + Clone ensures safe reuse patterns
  • Statistics tracking: Built-in monitoring with nanosecond-precision timing

§Performance Profile

  • Borrow latency: 5-20ns typical (RwLock read + SmallVec pop)
  • Return latency: 10-30ns typical (reset + RwLock write + SmallVec push)
  • Concurrency: Multiple concurrent borrowers, serialized returns
  • Memory footprint: Configurable capacity with pre-allocation

Implementations§

Source§

impl<T: Poolable + Clone> GenericPool<T>

Source

pub fn new() -> Self

Create a new object pool with default capacity

Source

pub fn with_capacity(capacity: usize) -> Self

Create a new object pool with specified capacity

Source

pub fn borrow(&self) -> T

Borrow an object from the pool

Returns a pre-allocated object that can be configured for use. If pool is empty, allocates a new object (tracked in stats).

Source

pub fn return_object(&self, object: T)

Return an object to the pool for reuse

The object will be available for future borrowing. If pool is full, the object is dropped (no memory leak).

Source

pub fn stats(&self) -> PoolStats

Get current pool statistics

Source

pub fn reset_stats(&self)

Reset pool statistics

Source

pub fn warmup(&self, iterations: usize)

Warm up the pool by pre-borrowing and returning objects

This helps establish optimal memory layout and cache patterns.

Trait Implementations§

Source§

impl<T: Debug + Poolable + Clone> Debug for GenericPool<T>

Source§

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

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

impl<T: Poolable + Clone> Default for GenericPool<T>

Source§

fn default() -> Self

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

Auto Trait Implementations§

§

impl<T> Freeze for GenericPool<T>

§

impl<T> !RefUnwindSafe for GenericPool<T>

§

impl<T> Send for GenericPool<T>
where T: Send + Sync,

§

impl<T> Sync for GenericPool<T>
where T: Send + Sync,

§

impl<T> Unpin for GenericPool<T>

§

impl<T> !UnwindSafe for GenericPool<T>

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

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

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

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

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.

§

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

§

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
§

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> 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 = 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.
§

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

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

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
§

fn with_current_subscriber(self) -> WithDispatch<Self>

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

impl<T> ErasedDestructor for T
where T: 'static,