TrackingAllocator

Struct TrackingAllocator 

Source
pub struct TrackingAllocator<A> { /* private fields */ }
Expand description

A global allocator that tracks allocations on a per-group basis.

This allocator provides the ability to track the allocations/deallocations, both in bytes and objects, for different, user-defined allocation groups.

§Allocation groups

Allocation (and deallocations) are tracked by allocation group. When this allocator is used, every allocation is associated with an allocation group. Allocation groups are user-defined, except for the default “root” allocation group which acts as a catch-all for allocations when a user-defined group is not entered.

§Token guard

When an allocation group is registered, an AllocationGroupToken is returned. This token can be used to “enter” the group, which attribute all allocations on the current thread to that group. Entering the group returns a drop guard that restores the previously entered allocation when it is dropped.

This allows for arbitrarily nested allocation groups.

§Changes to memory layout

In order to associate an allocation with the current allocation group, a small trailer is added to the requested allocation layout, in the form of a pointer to the statistics for the allocation group. This allows updating the statistics directly when an allocation is deallocated, without having to externally keep track of what group a given allocation belongs to. These statistics are updated directly when the allocation is initially made, and when it is deallocated.

This means that all requested allocations end up being one machine word larger: 4 bytes on 32-bit systems, and 8 bytes on 64-bit systems.

Implementations§

Source§

impl<A> TrackingAllocator<A>

Source

pub const fn new(allocator: A) -> Self

Creates a new TrackingAllocator that wraps another allocator.

The wrapped allocator is used to actually allocate and deallocate memory, while this allocator is responsible purely for tracking the allocations and deallocations themselves.

Trait Implementations§

Source§

impl<A> GlobalAlloc for TrackingAllocator<A>
where A: GlobalAlloc,

Source§

unsafe fn alloc(&self, layout: Layout) -> *mut u8

Allocates memory as described by the given layout. Read more
Source§

unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout)

Deallocates the block of memory at the given ptr pointer with the given layout. Read more
1.28.0 · Source§

unsafe fn alloc_zeroed(&self, layout: Layout) -> *mut u8

Behaves like alloc, but also ensures that the contents are set to zero before being returned. Read more
1.28.0 · Source§

unsafe fn realloc( &self, ptr: *mut u8, layout: Layout, new_size: usize, ) -> *mut u8

Shrinks or grows a block of memory to the given new_size in bytes. The block is described by the given ptr pointer and layout. Read more

Auto Trait Implementations§

§

impl<A> Freeze for TrackingAllocator<A>
where A: Freeze,

§

impl<A> RefUnwindSafe for TrackingAllocator<A>
where A: RefUnwindSafe,

§

impl<A> Send for TrackingAllocator<A>
where A: Send,

§

impl<A> Sync for TrackingAllocator<A>
where A: Sync,

§

impl<A> Unpin for TrackingAllocator<A>
where A: Unpin,

§

impl<A> UnwindSafe for TrackingAllocator<A>
where A: UnwindSafe,

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.

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

Source§

fn track_allocations(self, token: AllocationGroupToken) -> Tracked<Self>

Instruments this type by attaching the given allocation group token, returning a Tracked wrapper. Read more
Source§

fn in_current_allocation_group(self) -> Tracked<Self>

Instruments this type by attaching the current allocation group, returning a Tracked wrapper. 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<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