PtrPool

Struct PtrPool 

Source
pub struct PtrPool<T>
where T: Send,
{ /* private fields */ }
Expand description

An event pool referenced via raw pointer.

Only used in type names. Instances are created internally by OnceEventPool.

Methods from Deref<Target = OnceEventPool<T>>§

Source

pub fn bind_by_ref( &self, ) -> (PooledOnceSender<RefPool<'_, T>>, PooledOnceReceiver<RefPool<'_, T>>)

Creates sender and receiver endpoints connected by reference to the pool.

The pool will create a new event and return endpoints that reference it. When both endpoints are dropped, the event will be automatically cleaned up.

§Example
use events::OnceEventPool;

let pool = OnceEventPool::<i32>::new();

// First event usage
let (sender1, receiver1) = pool.bind_by_ref();
sender1.send(42);
let value1 = receiver1.await.unwrap();
assert_eq!(value1, 42);

// Second event usage - efficiently reuses the same underlying event
let (sender2, receiver2) = pool.bind_by_ref();
sender2.send(100);
let value2 = receiver2.await.unwrap();
assert_eq!(value2, 100);
Source

pub fn bind_by_arc( self: &Arc<Self>, ) -> (PooledOnceSender<ArcPool<T>>, PooledOnceReceiver<ArcPool<T>>)

Creates sender and receiver endpoints connected by Arc to the pool.

The pool will create a new event and return endpoints that hold Arc references. When both endpoints are dropped, the event will be automatically cleaned up.

§Example
use std::sync::Arc;

use events::OnceEventPool;

let pool = Arc::new(OnceEventPool::<i32>::new());

// First usage
let (sender1, receiver1) = pool.bind_by_arc();
sender1.send(42);
let value1 = futures::executor::block_on(receiver1).unwrap();
assert_eq!(value1, 42);

// Second usage - efficiently reuses the same pooled event
let (sender2, receiver2) = pool.bind_by_arc();
sender2.send(200);
let value2 = futures::executor::block_on(receiver2).unwrap();
assert_eq!(value2, 200);
Source

pub unsafe fn bind_by_ptr( self: Pin<&Self>, ) -> (PooledOnceSender<PtrPool<T>>, PooledOnceReceiver<PtrPool<T>>)

Creates sender and receiver endpoints connected by raw pointer to the pool.

The pool will create a new event and return endpoints that hold raw pointers. When both endpoints are dropped, the event will be automatically cleaned up.

§Safety

The caller must ensure that:

  • The pool remains valid and pinned for the entire lifetime of the sender and receiver
  • The sender and receiver are dropped before the pool is dropped
§Example
use events::OnceEventPool;

let pool = Box::pin(OnceEventPool::<i32>::new());

// First usage
// SAFETY: We ensure the pool is pinned and outlives the sender and receiver
let (sender1, receiver1) = unsafe { pool.as_ref().bind_by_ptr() };
sender1.send(42);
let value1 = futures::executor::block_on(receiver1).unwrap();
assert_eq!(value1, 42);

// Second usage - reuses the same event from the pool efficiently
// SAFETY: Pool is still valid and pinned
let (sender2, receiver2) = unsafe { pool.as_ref().bind_by_ptr() };
sender2.send(100);
let value2 = futures::executor::block_on(receiver2).unwrap();
assert_eq!(value2, 100);
// Both sender and receiver pairs are dropped here, before pool
Source

pub fn len(&self) -> usize

Returns the number of events currently in the pool.

This represents the count of events that are currently allocated in the pool, including those that are currently bound to sender/receiver endpoints. Events are removed from the pool only when both endpoints are dropped.

§Example
use events::OnceEventPool;

let pool = OnceEventPool::<i32>::new();
assert_eq!(pool.len(), 0);

let (sender, receiver) = pool.bind_by_ref();
assert_eq!(pool.len(), 1); // Event is in pool while endpoints exist

drop(sender);
drop(receiver);
assert_eq!(pool.len(), 0); // Event cleaned up after both endpoints dropped
Source

pub fn is_empty(&self) -> bool

Returns whether the pool is empty.

This is equivalent to pool.len() == 0 but may be more efficient. An empty pool may still have reserved capacity.

§Example
use events::OnceEventPool;

let pool = OnceEventPool::<i32>::new();
assert!(pool.is_empty());

let (sender, receiver) = pool.bind_by_ref();
assert!(!pool.is_empty()); // Pool has event while endpoints exist

drop(sender);
drop(receiver);
assert!(pool.is_empty()); // Pool empty after both endpoints dropped
Source

pub fn shrink_to_fit(&self)

Shrinks the capacity of the pool to reduce memory usage.

This method attempts to release unused memory by reducing the pool’s capacity. The actual reduction is implementation-dependent and may vary - some capacity may be released, or none at all.

§Example
use events::OnceEventPool;

let pool = OnceEventPool::<i32>::new();

// Use the pool which may grow its capacity
for _ in 0..100 {
    let (sender, receiver) = pool.bind_by_ref();
    sender.send(42);
    let _value = futures::executor::block_on(receiver);
}

// Attempt to shrink to reduce memory usage
pool.shrink_to_fit();
Source

pub fn inspect_awaiters(&self, f: impl FnMut(Option<&Backtrace>))

Uses the provided closure to inspect the backtraces of the most recent awaiter of each event in the pool (or None if it has never been awaited).

This method is only available in debug builds (cfg(debug_assertions)). For any data to be present, RUST_BACKTRACE=1 or RUST_LIB_BACKTRACE=1 must be set.

The closure is called once for each event in the pool that is currently being awaited by someone.

Trait Implementations§

Source§

impl<T> Clone for PtrPool<T>
where T: Send,

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<T> Debug for PtrPool<T>
where T: Send,

Source§

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

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

impl<T> Deref for PtrPool<T>
where T: Send,

Source§

type Target = OnceEventPool<T>

The resulting type after dereferencing.
Source§

fn deref(&self) -> &Self::Target

Dereferences the value.
Source§

impl<T: Send> ReflectiveTSend for PtrPool<T>

Source§

type T = T

The type T extracted from the type signature.
Source§

impl<T> Copy for PtrPool<T>
where T: Send + Copy,

Source§

impl<T> PoolRef<T> for PtrPool<T>
where T: Send,

Source§

impl<T> Send for PtrPool<T>
where T: Send,

Auto Trait Implementations§

§

impl<T> Freeze for PtrPool<T>

§

impl<T> RefUnwindSafe for PtrPool<T>

§

impl<T> !Sync for PtrPool<T>

§

impl<T> Unpin for PtrPool<T>

§

impl<T> UnwindSafe for PtrPool<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> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
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, 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<P, T> Receiver for P
where P: Deref<Target = T> + ?Sized, T: ?Sized,

Source§

type Target = T

🔬This is a nightly-only experimental API. (arbitrary_self_types)
The target type on which the method may be called.
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> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
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 = 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.