Skip to main content

UnifiedAllocator

Struct UnifiedAllocator 

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

Unified allocator interface that can use different allocation strategies

Implementations§

Source§

impl UnifiedAllocator

Source

pub fn new( base_ptr: NonNull<u8>, total_size: usize, config: UnifiedConfig, ) -> Result<Self, AllocationError>

Create a new unified allocator

Source

pub fn allocate( &mut self, size: usize, requested_allocator_type: AllocatorType, _alignment: Option<usize>, ) -> Result<NonNull<u8>, AllocationError>

Allocate memory using the unified interface

Source

pub fn deallocate( &mut self, ptr: NonNull<u8>, size: usize, ) -> Result<(), AllocationError>

Deallocate memory

Source

pub fn free( &mut self, ptr: *mut c_void, _allocator_type: AllocatorType, ) -> Result<(), AllocationError>

Free memory (alias for deallocate)

Source

pub fn reallocate( &mut self, _ptr: *mut c_void, new_size: usize, allocator_type: AllocatorType, ) -> Result<*mut c_void, AllocationError>

Allocate a fresh block for a reallocation request.

Deliberately does not free _ptr (its parameter is unused by design, not by oversight): the sole caller, crate::memory::GpuMemorySystem::reallocate, already owns the complete, correct realloc contract one layer up – it tracks the old allocation’s real size (which this layer does not), copies the live data with it via copy_nonoverlapping, and only then frees the old pointer. Freeing _ptr here as well would race that caller: it still reads from _ptr after this call returns whenever the new address differs (the overwhelmingly common case, since this always allocates fresh rather than truly growing in place), which would make that read a use-after-free and the caller’s own free a double-free.

Source

pub fn get_stats(&self) -> &UnifiedStats

Get unified statistics

Source

pub fn get_config(&self) -> &UnifiedConfig

Get the active configuration (thresholds, enabled sub-allocators, default strategy).

allocate currently always uses the type its caller passes rather than deriving one from buddy_threshold/slab_threshold/ arena_threshold/enable_auto_routing – centralizing that decision here would change GpuMemorySystem::choose_allocator’s tested routing boundaries (its hardcoded 1 KiB / 1 MiB cutovers do not line up with this config’s threshold values), which is a deliberate behavior decision left to that caller rather than one this lint pass makes unilaterally. Exposed so callers can inspect (and eventually route against) the real configuration instead of duplicating their own hardcoded thresholds.

Source

pub fn get_detailed_info(&self) -> DetailedAllocatorInfo

Get detailed allocator information

Source

pub fn reset_allocator( &mut self, allocator_type: AllocatorType, ) -> Result<(), AllocationError>

Reset specific allocator

Source

pub fn garbage_collect(&mut self) -> GarbageCollectionResult

Force garbage collection on applicable allocators

Source

pub fn optimize_strategies(&mut self) -> Result<(), AllocationError>

Optimize allocation strategies based on performance data

Trait Implementations§

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

Source§

fn downcast(&self) -> &T

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

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

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

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

Source§

fn upcast(&self) -> Option<&T>

Source§

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

Source§

fn vzip(self) -> V

Source§

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

Source§

impl<T> WasmNotSendSync for T

Source§

impl<T> WasmNotSync for T
where T: Sync,