#include <dl_allocator.h>
Public Member Functions | |
constexpr | DlAllocator () |
Constexpr constructor. Callers must explicitly call Init . | |
DlAllocator (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 |
Private Member Functions | |
BlockResult< BlockType > | ChooseBlock (Layout layout) override |
void | ReserveBlock (BlockType &block) override |
void | RecycleBlock (BlockType &block) override |
void | Flush () override |
void | DeallocateBlock (BlockType *&&block) override |
Additional Inherited Members | |
![]() | |
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 |
Doug Lea's allocator.
This allocator uses several types of buckets to quickly satisfy memory allocations with best-fit blocks as described by https://gee.cs.oswego.edu/dl/html/malloc.html
This implementation is simplified as sbrk
- and mmap
-related features are not currently supported.
Note that Doug Lea's "bins" are provided by pw_allocator's buckets. Both the the "fast" and "small" bins hold a single size, and can therefore be implemented using UnorderedBucket
. The "large" bins hold a range of sizes a use FastSortedBucket
to quickly return best-fit blocks as requested.
|
inline |
Non-constexpr constructor that automatically calls Init
.
[in] | region | Region of memory to use when satisfying allocation requests. The region MUST be valid as an argument to BlockType::Init . |
|
overrideprivatevirtual |
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 . |
Implements pw::allocator::BlockAllocator< BlockType_ >.
|
overrideprivatevirtual |
Frees the given block.
Derived classes may override this method to hook or even defer freeing blocks.
Reimplemented from pw::allocator::BlockAllocator< BlockType_ >.
|
inlineoverrideprivatevirtual |
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 from pw::allocator::BlockAllocator< BlockType_ >.
|
overrideprivatevirtual |
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 from pw::allocator::BlockAllocator< BlockType_ >.
|
overrideprivatevirtual |
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 from pw::allocator::BlockAllocator< BlockType_ >.