C/C++ API Reference
Loading...
Searching...
No Matches
pw::Allocator Class Referenceabstract

Overview

Abstract interface for variable-layout memory allocation.

The interface makes no guarantees about its implementation. Consumers of the generic interface must not make any assumptions around allocator behavior, thread safety, or performance.

Inheritance diagram for pw::Allocator:
pw::Deallocator pw::allocator::AbstractAllocator pw::allocator::FallbackAllocator pw::allocator::SynchronizedAllocator< LockType > pw::allocator::TrackingAllocator< MetricsType > pw::allocator::internal::GenericBlockAllocator pw::allocator::internal::GenericGuardedAllocator pw::allocator::test::AllocatorForTest< kBufferSize, BlockType_, MetricsType_ > pw::allocator::test::FaultInjectingAllocator

Public Types

using Fragmentation = allocator::Fragmentation
 
- Public Types inherited from pw::Deallocator
using Capabilities = allocator::Capabilities
 
using Capability = allocator::Capability
 
using Layout = allocator::Layout
 

Public Member Functions

void * Allocate (Layout layout)
 
template<typename T , int &... kExplicitGuard, std::enable_if_t<!std::is_array_v< T >, int > = 0, typename... Args>
T * New (Args &&... args)
 
template<typename T , int &... kExplicitGuard, typename ElementType = std::remove_extent_t<T>, std::enable_if_t< is_bounded_array_v< T >, int > = 0>
ElementType * New ()
 
template<typename T , int &... kExplicitGuard, typename ElementType = std::remove_extent_t<T>, std::enable_if_t< is_unbounded_array_v< T >, int > = 0>
ElementType * New (size_t count)
 
template<typename T , int &... kExplicitGuard, typename ElementType = std::remove_extent_t<T>, std::enable_if_t< is_unbounded_array_v< T >, int > = 0>
ElementType * New (size_t count, size_t alignment)
 Constructs an alignment-byte aligned array of count objects.
 
template<typename T , int &... kExplicitGuard, std::enable_if_t<!std::is_array_v< T >, int > = 0, typename... Args>
UniquePtr< T > MakeUnique (Args &&... args)
 
template<typename T , std::enable_if_t< is_unbounded_array_v< T >, int > = 0>
UniquePtr< T > MakeUnique (size_t size)
 
template<typename T , std::enable_if_t< is_unbounded_array_v< T >, int > = 0>
UniquePtr< T > MakeUnique (size_t size, size_t alignment)
 
template<typename T , std::enable_if_t< is_bounded_array_v< T >, int > = 0>
UniquePtr< T > MakeUnique ()
 
template<typename T , int &... kExplicitGuard, std::enable_if_t<!std::is_array_v< T >, int > = 0, typename... Args>
SharedPtr< T > MakeShared (Args &&... args)
 
template<typename T , std::enable_if_t< is_unbounded_array_v< T >, int > = 0>
SharedPtr< T > MakeShared (size_t size)
 
template<typename T , std::enable_if_t< is_unbounded_array_v< T >, int > = 0>
SharedPtr< T > MakeShared (size_t size, size_t alignment)
 
template<typename T , std::enable_if_t< is_bounded_array_v< T >, int > = 0>
SharedPtr< T > MakeShared ()
 
bool Resize (void *ptr, size_t new_size)
 
void * Reallocate (void *ptr, Layout new_layout)
 
size_t GetAllocated () const
 
std::optional< FragmentationMeasureFragmentation () const
 Returns fragmentation information for the allocator's memory region.
 
- Public Member Functions inherited from pw::Deallocator
constexpr const Capabilitiescapabilities () const
 
constexpr bool HasCapability (Capability capability) const
 Returns whether a given capability is enabled for this object.
 
void Deallocate (void *ptr)
 
template<typename ElementType >
void DeleteArray (ElementType *ptr, size_t count)
 
StatusWithSize GetCapacity () const
 
bool IsEqual (const Deallocator &other) const
 
template<typename T , int &... kExplicitGuard, std::enable_if_t<!std::is_array_v< T >, int > = 0>
void Delete (T *ptr)
 
template<typename T , int &... kExplicitGuard, typename ElementType = std::remove_extent_t<T>, std::enable_if_t< is_bounded_array_v< T >, int > = 0>
void Delete (ElementType *ptr)
 
template<typename T , int &... kExplicitGuard, typename ElementType = std::remove_extent_t<T>, std::enable_if_t< is_unbounded_array_v< T >, int > = 0>
void Delete (ElementType *ptr, size_t count)
 

Protected Member Functions

constexpr Allocator ()=default
 TODO(b/326509341): Remove when downstream consumers migrate.
 
constexpr Allocator (const Capabilities &capabilities)
 
virtual void * DoAllocate (Layout layout)=0
 
virtual bool DoResize (void *ptr, size_t new_size)
 
virtual void * DoReallocate (void *ptr, Layout new_layout)
 
virtual size_t DoGetAllocated () const
 
virtual std::optional< FragmentationDoMeasureFragmentation () const
 Returns fragmentation information for the allocator's memory region.
 
- Protected Member Functions inherited from pw::Deallocator
constexpr Deallocator ()=default
 TODO(b/326509341): Remove when downstream consumers migrate.
 
constexpr Deallocator (const Capabilities &capabilities)
 

Additional Inherited Members

- Static Protected Attributes inherited from pw::Deallocator
template<typename T >
static constexpr bool is_bounded_array_v = ::pw::is_bounded_array_v<T>
 
template<typename T >
static constexpr bool is_unbounded_array_v = ::pw::is_unbounded_array_v<T>
 

Member Function Documentation

◆ Allocate()

void * pw::Allocator::Allocate ( Layout  layout)

Allocates a block of memory with the specified size and alignment.

Returns nullptr if the allocation cannot be made, or the layout has a size of 0.

Parameters
[in]layoutDescribes the memory to be allocated.

◆ DoAllocate()

◆ DoGetAllocated()

◆ DoMeasureFragmentation()

◆ DoReallocate()

virtual void * pw::Allocator::DoReallocate ( void *  ptr,
Layout  new_layout 
)
protectedvirtual

Modifies the size of a previously-allocated block of memory.

Returns pointer to the modified block of memory, or nullptr if the memory could not be modified.

The data stored by the memory being modified must be trivially copyable. If it is not, callers should themselves attempt to Resize, then Allocate, move the data, and Deallocate as needed.

If nullptr is returned, the block of memory is unchanged. In particular, if the new_layout has a size of 0, the given pointer will NOT be deallocated.

TODO(b/331290408): This error condition needs to be better communicated to module users, who may assume the pointer is freed.

Unlike Resize, providing a null pointer will return a new allocation.

If the request can be satisfied using Resize, the alignment parameter may be ignored.

Parameters
[in]ptrPointer to previously-allocated memory.
[in]new_layoutDescribes the memory to be allocated.

The default implementation will first try to Resize the data. If that is unsuccessful, it will allocate an entirely new block, copy existing data, and deallocate the given block.

Reimplemented in pw::allocator::test::FaultInjectingAllocator, pw::allocator::LibCAllocator, pw::allocator::SynchronizedAllocator< LockType >, and pw::allocator::TrackingAllocator< MetricsType >.

◆ DoResize()

virtual bool pw::Allocator::DoResize ( void *  ptr,
size_t  new_size 
)
inlineprotectedvirtual

Modifies the size of an previously-allocated block of memory without copying any data.

Returns true if its size was changed without copying data to a new allocation; otherwise returns false.

In particular, it always returns true if the old_layout.size() equals new_size, and always returns false if the given pointer is null, the old_layout.size() is 0, or the new_size is 0.

Parameters
[in]ptrPointer to previously-allocated memory.
[in]new_sizeRequested new size for the memory allocation.

Reimplemented in pw::allocator::AbstractAllocator, pw::allocator::BlockAllocator< BlockType_ >, pw::allocator::BlockAllocator< BucketBlock<> >, pw::allocator::BlockAllocator< BestFitBlock< uintptr_t > >, pw::allocator::BlockAllocator< DlBlock< uintptr_t > >, pw::allocator::BlockAllocator< FirstFitBlock< uintptr_t > >, pw::allocator::BlockAllocator< TlsfBlock< uint32_t > >, pw::allocator::BlockAllocator< WorstFitBlock< uintptr_t > >, pw::allocator::BlockAllocator< BlockType >, pw::allocator::BlockAllocator< pw::allocator::TinyBlock >, pw::allocator::FallbackAllocator, pw::allocator::test::FaultInjectingAllocator, pw::allocator::GuardedAllocator< BlockAllocatorType, LockType >, pw::allocator::SynchronizedAllocator< LockType >, pw::allocator::test::AllocatorForTest< kBufferSize, BlockType_, MetricsType_ >, and pw::allocator::TrackingAllocator< MetricsType >.

◆ GetAllocated()

size_t pw::Allocator::GetAllocated ( ) const
inline

Returns the total bytes that have been allocated by this allocator, or size_t(-1) if this allocator does not track its total allocated bytes.

◆ MakeShared() [1/4]

template<typename T , std::enable_if_t< is_bounded_array_v< T >, int > = 0>
SharedPtr< T > pw::Allocator::MakeShared ( )
inline

Constructs an alignment-byte aligned array of size objects, and wraps it in a SharedPtr

The returned value may contain null if allocating memory for the object fails. Callers must check for null before using the SharedPtr.

Template Parameters
TAn array type.
Parameters
[in]sizeNumber of objects to allocate.
[in]alignmentObject alignment.

◆ MakeShared() [2/4]

template<typename T , int &... kExplicitGuard, std::enable_if_t<!std::is_array_v< T >, int > = 0, typename... Args>
SharedPtr< T > pw::Allocator::MakeShared ( Args &&...  args)
inline

Constructs and object of type T from the given args, and wraps it in a SharedPtr

The returned value may contain null if allocating memory for the object fails. Callers must check for null before using the SharedPtr.

Parameters
[in]argsArguments passed to the object constructor.

◆ MakeShared() [3/4]

template<typename T , std::enable_if_t< is_unbounded_array_v< T >, int > = 0>
SharedPtr< T > pw::Allocator::MakeShared ( size_t  size)
inline

Constructs an array of size objects, and wraps it in a UniquePtr

The returned value may contain null if allocating memory for the object fails. Callers must check for null before using the UniquePtr.

Template Parameters
TAn array type.
Parameters
[in]sizeNumber of objects to allocate.

◆ MakeShared() [4/4]

template<typename T , std::enable_if_t< is_unbounded_array_v< T >, int > = 0>
SharedPtr< T > pw::Allocator::MakeShared ( size_t  size,
size_t  alignment 
)
inline

Constructs an alignment-byte aligned array of size objects, and wraps it in a SharedPtr

The returned value may contain null if allocating memory for the object fails. Callers must check for null before using the SharedPtr.

Template Parameters
TAn array type.
Parameters
[in]sizeNumber of objects to allocate.
[in]alignmentObject alignment.

◆ MakeUnique() [1/4]

template<typename T , std::enable_if_t< is_bounded_array_v< T >, int > = 0>
UniquePtr< T > pw::Allocator::MakeUnique ( )
inline

Constructs an array of objects and wraps it in a UniquePtr.

The returned value may contain null if allocating memory for the object fails. Callers must check for null before using the UniquePtr.

Template Parameters
TA bounded array type, like int[3].

◆ MakeUnique() [2/4]

template<typename T , int &... kExplicitGuard, std::enable_if_t<!std::is_array_v< T >, int > = 0, typename... Args>
UniquePtr< T > pw::Allocator::MakeUnique ( Args &&...  args)
inline

Constructs and object of type T from the given args, and wraps it in a UniquePtr

The returned value may contain null if allocating memory for the object fails. Callers must check for null before using the UniquePtr.

Template Parameters
TA non-array object type, like int.
Parameters
[in]argsArguments passed to the object constructor.

◆ MakeUnique() [3/4]

template<typename T , std::enable_if_t< is_unbounded_array_v< T >, int > = 0>
UniquePtr< T > pw::Allocator::MakeUnique ( size_t  size)
inline

Constructs an array of size objects, and wraps it in a UniquePtr

The returned value may contain null if allocating memory for the object fails. Callers must check for null before using the UniquePtr.

Template Parameters
TAn unbounded array type, like int[].
Parameters
[in]sizeNumber of objects to allocate.

◆ MakeUnique() [4/4]

template<typename T , std::enable_if_t< is_unbounded_array_v< T >, int > = 0>
UniquePtr< T > pw::Allocator::MakeUnique ( size_t  size,
size_t  alignment 
)
inline

Constructs an alignment-byte aligned array of size objects and wraps it in a UniquePtr.

The returned value may contain null if allocating memory for the object fails. Callers must check for null before using the UniquePtr.

Template Parameters
TAn unbounded array type, like int[].
Parameters
[in]sizeNumber of objects to allocate.
[in]alignmentObject alignment.

◆ New() [1/4]

template<typename T , int &... kExplicitGuard, typename ElementType = std::remove_extent_t<T>, std::enable_if_t< is_bounded_array_v< T >, int > = 0>
ElementType * pw::Allocator::New ( )
inline

Constructs an array of objects.

The return value is nullable, as allocating memory for the object may fail. Callers must check for this error before using the resulting pointer.

Template Parameters
TA bounded array type, like int[3].
Parameters
[in]countNumber of objects to allocate.

◆ New() [2/4]

template<typename T , int &... kExplicitGuard, std::enable_if_t<!std::is_array_v< T >, int > = 0, typename... Args>
T * pw::Allocator::New ( Args &&...  args)
inline

Constructs an object of type T from the given args.

The return value is nullable, as allocating memory for the object may fail. Callers must check for this error before using the resulting pointer.

Template Parameters
TA non-array object type, like int.
Parameters
[in]argsArguments passed to the object constructor.

◆ New() [3/4]

template<typename T , int &... kExplicitGuard, typename ElementType = std::remove_extent_t<T>, std::enable_if_t< is_unbounded_array_v< T >, int > = 0>
ElementType * pw::Allocator::New ( size_t  count)
inline

Constructs an array of count objects.

The return value is nullable, as allocating memory for the object may fail. Callers must check for this error before using the resulting pointer.

Template Parameters
TAn unbounded array type, like int[].
Parameters
[in]countNumber of objects to allocate.

◆ New() [4/4]

template<typename T , int &... kExplicitGuard, typename ElementType = std::remove_extent_t<T>, std::enable_if_t< is_unbounded_array_v< T >, int > = 0>
ElementType * pw::Allocator::New ( size_t  count,
size_t  alignment 
)
inline

Constructs an alignment-byte aligned array of count objects.

The return value is nullable, as allocating memory for the object may fail. Callers must check for this error before using the resulting pointer.

Template Parameters
TAn unbounded array type, like int[].
Parameters
[in]countNumber of objects to allocate.
[in]alignmentAlignment to use for the start of the array.

◆ Reallocate()

void * pw::Allocator::Reallocate ( void *  ptr,
Layout  new_layout 
)

Modifies the size of a previously-allocated block of memory.

Returns pointer to the modified block of memory, or nullptr if the memory could not be modified.

The data stored by the memory being modified must be trivially copyable. If it is not, callers should themselves attempt to Resize, then Allocate, move the data, and Deallocate as needed.

If nullptr is returned, the block of memory is unchanged. In particular, if the new_layout has a size of 0, the given pointer will NOT be deallocated.

TODO(b/331290408): This error condition needs to be better communicated to module users, who may assume the pointer is freed.

Unlike Resize, providing a null pointer will return a new allocation.

If the request can be satisfied using Resize, the alignment parameter may be ignored.

Parameters
[in]ptrPointer to previously-allocated memory.
[in]new_layoutDescribes the memory to be allocated.

◆ Resize()

bool pw::Allocator::Resize ( void *  ptr,
size_t  new_size 
)

Modifies the size of an previously-allocated block of memory without copying any data.

Returns true if its size was changed without copying data to a new allocation; otherwise returns false.

In particular, it always returns true if the old_layout.size() equals new_size, and always returns false if the given pointer is null, the old_layout.size() is 0, or the new_size is 0.

Parameters
[in]ptrPointer to previously-allocated memory.
[in]new_sizeRequested new size for the memory allocation.

The documentation for this class was generated from the following file: