#include <block_allocator.h>
Public Types | |
using | BlockType = BlockType_ |
using | Range = typename BlockType::Range |
![]() | |
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. | |
![]() | |
GenericBlockAllocator (const GenericBlockAllocator &)=delete | |
GenericBlockAllocator & | operator= (const GenericBlockAllocator &)=delete |
GenericBlockAllocator (GenericBlockAllocator &&)=delete | |
GenericBlockAllocator & | operator= (GenericBlockAllocator &&)=delete |
![]() | |
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 |
![]() | |
constexpr const Capabilities & | capabilities () 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) |
![]() | |
constexpr | GenericBlockAllocator (Capabilities capabilities) |
![]() | |
constexpr | Allocator ()=default |
TODO(b/326509341): Remove when downstream consumers migrate. | |
constexpr | Allocator (const Capabilities &capabilities) |
![]() | |
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< Layout > | DoGetInfo (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 | |
![]() | |
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. | |
![]() | |
template<typename T > | |
static constexpr bool | is_bounded_array_v |
template<typename T > | |
static constexpr bool | is_unbounded_array_v |
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.
|
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.
block | Used to return the chosen block. |
layout | Same 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 >.
|
protectedvirtual |
Frees the given block.
Derived classes may override this method to hook or even defer freeing blocks.
Reimplemented in pw::allocator::DlAllocator< BlockType >.
|
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.
[in] | layout | Describes the memory to be allocated. |
Implements pw::Allocator.
|
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.
[in] | ptr | Pointer to previously-allocated memory. |
|
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.
[in] | ptr | Pointer to previously-allocated memory. |
|
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.
|
overrideprivate |
|
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.
[in] | ptr | Pointer to previously-allocated memory. |
[in] | new_size | Requested new size for the memory allocation. |
Reimplemented from pw::Allocator.
|
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 >.
|
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.
ptr | Pointer to an allocated block's usable space. |
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. * *
|
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.
[in] | begin | The first block for this allocator. The block must not have a previous block. |
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.
[in] | region | Region of memory to use when satisfying allocation requests. The region MUST be valid as an argument to BlockType::Init . |
|
inlineprivatevirtual |
Indicates that a block is now free.
Does nothing by default. Derived class may overload to do additional bookkeeeping.
block | The block being freed. |
Reimplemented 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 >.
|
inlineprivatevirtual |
Indicates that a block will no longer be free.
Does nothing by default. Derived class may overload to do additional bookkeeeping.
block | The block being freed. |
Reimplemented 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 >.
|
staticconstexpr |