Pigweed
 
Loading...
Searching...
No Matches
pw::allocator::DlAllocator< BlockType > Class Template Reference

#include <dl_allocator.h>

Inheritance diagram for pw::allocator::DlAllocator< BlockType >:
pw::allocator::BlockAllocator< BlockType_ > pw::allocator::internal::GenericBlockAllocator pw::Allocator pw::Deallocator

Public Member Functions

constexpr DlAllocator ()
 Constexpr constructor. Callers must explicitly call Init.
 
 DlAllocator (ByteSpan region)
 
- Public Member Functions inherited from pw::allocator::BlockAllocator< BlockType_ >
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
 

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

- Public Types inherited from pw::allocator::BlockAllocator< BlockType_ >
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
 
- Static Public Attributes inherited from pw::allocator::BlockAllocator< BlockType_ >
static constexpr Capabilities kCapabilities
 
static constexpr size_t kPoisonInterval = PW_ALLOCATOR_BLOCK_POISON_INTERVAL
 
- Protected Member Functions inherited from pw::allocator::BlockAllocator< BlockType_ >
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)
 
- 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 = DlBlock<uintptr_t>>
class pw::allocator::DlAllocator< BlockType >

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.

Constructor & Destructor Documentation

◆ DlAllocator()

template<typename BlockType = DlBlock<uintptr_t>>
pw::allocator::DlAllocator< BlockType >::DlAllocator ( ByteSpan  region)
inline

Non-constexpr constructor that automatically calls Init.

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

Member Function Documentation

◆ ChooseBlock()

template<typename BlockType >
BlockResult< BlockType > pw::allocator::DlAllocator< BlockType >::ChooseBlock ( Layout  layout)
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.

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

Implements pw::allocator::BlockAllocator< BlockType_ >.

◆ DeallocateBlock()

template<typename BlockType >
void pw::allocator::DlAllocator< BlockType >::DeallocateBlock ( BlockType *&&  block)
overrideprivatevirtual

Frees the given block.

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

Reimplemented from pw::allocator::BlockAllocator< BlockType_ >.

◆ Flush()

template<typename BlockType = DlBlock<uintptr_t>>
void pw::allocator::DlAllocator< BlockType >::Flush ( )
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_ >.

◆ RecycleBlock()

template<typename BlockType >
void pw::allocator::DlAllocator< BlockType >::RecycleBlock ( BlockType &  block)
overrideprivatevirtual

Indicates that a block is now free.

Does nothing by default. Derived class may overload to do additional bookkeeeping.

Parameters
blockThe block being freed.

Reimplemented from pw::allocator::BlockAllocator< BlockType_ >.

◆ ReserveBlock()

template<typename BlockType >
void pw::allocator::DlAllocator< BlockType >::ReserveBlock ( BlockType &  block)
overrideprivatevirtual

Indicates that a block will no longer be free.

Does nothing by default. Derived class may overload to do additional bookkeeeping.

Parameters
blockThe block being freed.

Reimplemented from pw::allocator::BlockAllocator< BlockType_ >.


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