|
constexpr | TlsfAllocator () |
| Constexpr constructor. Callers must explicitly call Init .
|
|
| TlsfAllocator (ByteSpan region) |
|
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 |
|
|
using | BlockType = BlockType_ |
|
using | Range = typename BlockType::Range |
|
using | Capabilities = allocator::Capabilities |
|
using | Capability = allocator::Capability |
|
using | Layout = allocator::Layout |
|
static constexpr Capabilities | kCapabilities |
|
static constexpr size_t | kPoisonInterval = PW_ALLOCATOR_BLOCK_POISON_INTERVAL |
|
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) |
|
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 |
|
template<typename BlockType = TlsfBlock<uint32_t>, size_t kMinSize = TlsfDefaults::kMinSize, size_t kNumShelves = TlsfDefaults::kNumShelves>
class pw::allocator::TlsfAllocator< BlockType, kMinSize, kNumShelves >
Two-layered, segregated fit allocator.
This allocator uses a two-dimensional array of buckets to quickly satisfy memory allocations with best-fit blocks as described by http://www.gii.upv.es/tlsf/files/papers/ecrts04_tlsf.pdf
This class refers to the "second-level arrays" in that paper as "shelves". Each shelf holds an array of Buckets, and an instance of this class holds an array of shelves. Conceptually, buckets can be thought of as being organized on a set of "shelves", with each shelf having 16 buckets arranged from smallest maximum inner size to largest. The smallest maximum inner size on a shelf is a power of 2, and the shelves are arranged from the kMinSize
on the "bottom" to the largest maximum inner sizes on the "top". The last bucket on the topmost shelf is unbounded to handle any blocks of arbitrary size.
For example, if kMinSize
is 64, and kNumShelves
is 10, than the maximum inner sizes of buckets on each shelf could be represented as:
{
shelves_[9]: { 32k, 34k, ..., 62k, inf },
...: { ..., ..., ..., ..., ... },
shelves_[1]: { 128, 136, ..., 240, 248 },
shelves_[0]: { 64, 68, ..., 120, 124 },
}
- Template Parameters
-
BlockType | Block implementation |
kMinSize | Maximum inner size of blocks in the first bucket on lowest shelf. |
kNumShelves | Number of rows in the two-dimensional array. |