Pigweed
 
Loading...
Searching...
No Matches
pw::allocator::BlockAllocator< BlockType_ > Class Template Referenceabstract

#include <block_allocator.h>

Inheritance diagram for pw::allocator::BlockAllocator< BlockType_ >:
pw::allocator::internal::GenericBlockAllocator pw::Allocator pw::Deallocator pw::allocator::BestFitAllocator< BlockType > pw::allocator::BucketAllocator< BlockType, kMinInnerSize, kNumBuckets > pw::allocator::DlAllocator< BlockType > pw::allocator::FirstFitAllocator< BlockType > pw::allocator::TlsfAllocator< BlockType, kMinSize, kNumShelves > pw::allocator::WorstFitAllocator< BlockType >

Public Types

using BlockType = BlockType_
 
using Range = typename BlockType::Range
 
- Public Types inherited from pw::Deallocator
using Capabilities = allocator::Capabilities
 
using Capability = allocator::Capability
 
using Layout = allocator::Layout
 

Public Member Functions

Range blocks () const
 Returns a Range of blocks tracking the memory of this allocator.
 
void Init (ByteSpan region)
 
Fragmentation MeasureFragmentation () const
 Returns fragmentation information for the block allocator's memory region.
 
- Public Member Functions inherited from pw::allocator::internal::GenericBlockAllocator
 GenericBlockAllocator (const GenericBlockAllocator &)=delete
 
GenericBlockAllocatoroperator= (const GenericBlockAllocator &)=delete
 
 GenericBlockAllocator (GenericBlockAllocator &&)=delete
 
GenericBlockAllocatoroperator= (GenericBlockAllocator &&)=delete
 
- Public Member Functions inherited from pw::Allocator
void * Allocate (Layout layout)
 
template<typename T , int &... kExplicitGuard, typename... Args>
std::enable_if_t<!std::is_array_v< T >, T * > New (Args &&... args)
 
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)
 
template<typename T >
T * NewArray (size_t count)
 
template<typename T >
T * NewArray (size_t count, size_t alignment)
 
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 , int &... kExplicitGuard, std::enable_if_t< is_unbounded_array_v< T >, int > = 0>
UniquePtr< T > MakeUnique (size_t size)
 
template<typename T , int &... kExplicitGuard, std::enable_if_t< is_unbounded_array_v< T >, int > = 0>
UniquePtr< T > MakeUnique (size_t size, size_t alignment)
 
template<typename T >
UniquePtr< T[]> MakeUniqueArray (size_t size)
 
template<typename T >
UniquePtr< T[]> MakeUniqueArray (size_t size, size_t alignment)
 
template<typename T , int &... kExplicitGuard, std::enable_if_t< is_bounded_array_v< T >, int > = 0, typename... Args>
void MakeUnique (Args &&...)=delete
 
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 , int &... kExplicitGuard, std::enable_if_t< is_unbounded_array_v< T >, int > = 0>
SharedPtr< T > MakeShared (size_t size)
 
template<typename T , int &... kExplicitGuard, std::enable_if_t< is_unbounded_array_v< T >, int > = 0>
SharedPtr< T > MakeShared (size_t size, size_t alignment)
 
template<typename T , int &... kExplicitGuard, std::enable_if_t< is_bounded_array_v< T >, int > = 0, typename... Args>
std::enable_if_t< is_bounded_array_v< T > > MakeShared (Args &&...)=delete
 
bool Resize (void *ptr, size_t new_size)
 
bool Resize (void *ptr, Layout layout, size_t new_size)
 
void * Reallocate (void *ptr, Layout new_layout)
 
void * Reallocate (void *ptr, Layout old_layout, size_t new_size)
 
size_t GetAllocated () const
 
- Public Member Functions inherited from pw::Deallocator
constexpr const Capabilitiescapabilities () const
 
bool HasCapability (Capability capability) const
 Returns whether a given capabilityis enabled for this object.
 
void Deallocate (void *ptr)
 
void Deallocate (void *ptr, Layout layout)
 
template<typename T >
void Delete (T *ptr)
 
StatusWithSize GetCapacity () const
 
bool IsEqual (const Deallocator &other) const
 
template<typename T , int &... kExplicitGuard, std::enable_if_t< is_bounded_array_v< T >, int > = 0, typename... Args>
void WrapUnique (Args &&...)=delete
 

Static Public Attributes

static constexpr Capabilities kCapabilities
 
static constexpr size_t kPoisonInterval = PW_ALLOCATOR_BLOCK_POISON_INTERVAL
 

Protected Member Functions

void Init (BlockType *begin)
 
template<typename Ptr >
internal::copy_const_ptr_t< Ptr, BlockType * > FromUsableSpace (Ptr ptr) const
 
virtual void DeallocateBlock (BlockType *&&block)
 
- Protected Member Functions inherited from pw::allocator::internal::GenericBlockAllocator
constexpr GenericBlockAllocator (Capabilities capabilities)
 
- Protected Member Functions inherited from pw::Allocator
constexpr Allocator ()=default
 TODO(b/326509341): Remove when downstream consumers migrate.
 
constexpr Allocator (const Capabilities &capabilities)
 
- Protected Member Functions inherited from pw::Deallocator
constexpr Deallocator ()=default
 TODO(b/326509341): Remove when downstream consumers migrate.
 
constexpr Deallocator (const Capabilities &capabilities)
 
template<typename T , std::enable_if_t<!std::is_array_v< T >, int > = 0>
UniquePtr< T > WrapUnique (T *ptr)
 
template<typename T , int &... kExplicitGuard, typename ElementType = std::remove_extent_t<T>, std::enable_if_t< is_unbounded_array_v< T >, int > = 0>
UniquePtr< T > WrapUnique (ElementType *ptr, size_t size)
 
template<typename T >
UniquePtr< T[]> WrapUniqueArray (T *ptr, size_t size)
 

Private Member Functions

void * DoAllocate (Layout layout) override
 
void DoDeallocate (void *ptr) override
 
void DoDeallocate (void *ptr, Layout) override
 
bool DoResize (void *ptr, size_t new_size) override
 
size_t DoGetAllocated () const override
 
Result< LayoutDoGetInfo (InfoType info_type, const void *ptr) const override
 
virtual BlockResult< BlockType > ChooseBlock (Layout layout)=0
 
virtual void ReserveBlock (BlockType &)
 
virtual void RecycleBlock (BlockType &)
 
virtual void Flush ()
 

Friends

template<typename , size_t >
class test::BlockAllocatorTest
 

Additional Inherited Members

- Static Protected Member Functions inherited from pw::allocator::internal::GenericBlockAllocator
template<typename BlockType >
static constexpr Capabilities GetCapabilities ()
 
static void CrashOnAllocated (const void *allocated)
 
static void CrashOnOutOfRange (const void *freed)
 
static void CrashOnDoubleFree (const void *freed)
 Crashes with an informational message that a given block was freed twice.
 
- Static Protected Attributes inherited from pw::Deallocator
template<typename T >
static constexpr bool is_bounded_array_v
 
template<typename T >
static constexpr bool is_unbounded_array_v
 

Detailed Description

template<typename BlockType_>
class pw::allocator::BlockAllocator< BlockType_ >

A memory allocator that uses a list of blocks.

This class does not implement ChooseBlock and cannot be used directly. Instead, use one of its specializations.

NOTE!! Do NOT use memory returned from this allocator as the backing for another allocator. If this is done, the Query method may incorrectly think pointers returned by that allocator were created by this one, and report that this allocator can de/reallocate them.

Member Function Documentation

◆ ChooseBlock()

template<typename BlockType_ >
virtual BlockResult< BlockType > pw::allocator::BlockAllocator< BlockType_ >::ChooseBlock ( Layout  layout)
privatepure virtual

Selects a free block to allocate from.

This method represents the allocator-specific strategy of choosing which block should be used to satisfy allocation requests. If the returned result indicates success, block will be replaced by the chosen block.

Parameters
blockUsed to return the chosen block.
layoutSame as Allocator::Allocate.

Implemented in pw::allocator::BestFitAllocator< BlockType >, pw::allocator::BucketAllocator< BlockType, kMinInnerSize, kNumBuckets >, pw::allocator::DlAllocator< BlockType >, pw::allocator::FirstFitAllocator< BlockType >, pw::allocator::TlsfAllocator< BlockType, kMinSize, kNumShelves >, and pw::allocator::WorstFitAllocator< BlockType >.

◆ DeallocateBlock()

template<typename BlockType >
void pw::allocator::BlockAllocator< BlockType >::DeallocateBlock ( BlockType *&&  block)
protectedvirtual

Frees the given block.

Derived classes may override this method to hook or even defer freeing blocks.

Reimplemented in pw::allocator::DlAllocator< BlockType >.

◆ DoAllocate()

template<typename BlockType >
void * pw::allocator::BlockAllocator< BlockType >::DoAllocate ( Layout  layout)
overrideprivatevirtual

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.

Implements pw::Allocator.

◆ DoDeallocate() [1/2]

template<typename BlockType >
void pw::allocator::BlockAllocator< BlockType >::DoDeallocate ( void *  ptr)
overrideprivate

Releases a previously-allocated block of memory.

The given pointer must have been previously provided by this memory resource; otherwise the behavior is undefined.

Parameters
[in]ptrPointer to previously-allocated memory.

◆ DoDeallocate() [2/2]

template<typename BlockType_ >
void pw::allocator::BlockAllocator< BlockType_ >::DoDeallocate ( void *  ptr,
Layout   
)
inlineoverrideprivate

Releases a previously-allocated block of memory.

The given pointer must have been previously provided by this memory resource; otherwise the behavior is undefined.

Parameters
[in]ptrPointer to previously-allocated memory.

◆ DoGetAllocated()

template<typename BlockType_ >
size_t pw::allocator::BlockAllocator< BlockType_ >::DoGetAllocated ( ) const
inlineoverrideprivatevirtual

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.

Reimplemented from pw::Allocator.

◆ DoGetInfo()

template<typename BlockType >
Result< Layout > pw::allocator::BlockAllocator< BlockType >::DoGetInfo ( InfoType  info_type,
const void *  ptr 
) const
overrideprivate

◆ DoResize()

template<typename BlockType >
bool pw::allocator::BlockAllocator< BlockType >::DoResize ( void *  ptr,
size_t  new_size 
)
overrideprivatevirtual

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 from pw::Allocator.

◆ Flush()

template<typename BlockType_ >
virtual void pw::allocator::BlockAllocator< BlockType_ >::Flush ( )
inlineprivatevirtual

Completes any pending deallocations.

After calling this method, all memory that has been passed to Deallocate will be free and available for subsequent allocations.

An allocator implementation may wish to defer doing the work of freeing a block and potentially merging it with its neighbors in case it subsequently receives a request for the block's exact size. In this case it must override this method and clear any caches of freed blocks.

Allocators that free blocks immediately upon a call to DoDeallocate can simply use the default implementation that does nothing.

Reimplemented in pw::allocator::DlAllocator< BlockType >.

◆ FromUsableSpace()

template<typename BlockType >
template<typename Ptr >
internal::copy_const_ptr_t< Ptr, BlockType * > pw::allocator::BlockAllocator< BlockType >::FromUsableSpace ( Ptr  ptr) const
protected

Returns the block associated with a pointer.

If the given pointer is to this allocator's memory region, but not to a valid block, the memory is corrupted and this method will crash to assist in uncovering the underlying bug.

Parameters
ptrPointer to an allocated block's usable space.
Returns
embed:rst:leading-asterisk
 
* 
*  .. pw-status-codes::
* 
*     OK: Result contains a pointer to the block.
* 
*     OUT_OF_RANGE: Given pointer is outside the allocator's memory.
* 
*  

◆ Init() [1/2]

template<typename BlockType >
void pw::allocator::BlockAllocator< BlockType >::Init ( BlockType *  begin)
protected

Sets the blocks to be used by this allocator.

This method will use the sequence of blocks including and following begin. These blocks which must be valid.

Parameters
[in]beginThe first block for this allocator. The block must not have a previous block.

◆ Init() [2/2]

template<typename BlockType >
void pw::allocator::BlockAllocator< BlockType >::Init ( ByteSpan  region)

Sets the memory region to be used by this allocator.

This method will instantiate an initial block using the memory region.

Parameters
[in]regionRegion of memory to use when satisfying allocation requests. The region MUST be valid as an argument to BlockType::Init.

◆ RecycleBlock()

template<typename BlockType_ >
virtual void pw::allocator::BlockAllocator< BlockType_ >::RecycleBlock ( BlockType &  )
inlineprivatevirtual

◆ ReserveBlock()

template<typename BlockType_ >
virtual void pw::allocator::BlockAllocator< BlockType_ >::ReserveBlock ( BlockType &  )
inlineprivatevirtual

Member Data Documentation

◆ kCapabilities

template<typename BlockType_ >
constexpr Capabilities pw::allocator::BlockAllocator< BlockType_ >::kCapabilities
staticconstexpr
Initial value:
=
Base::GetCapabilities<BlockType>()

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