#include <tracking_allocator.h>
Public Member Functions | |
TrackingAllocator (metric::Token token, Allocator &allocator) | |
template<typename OtherMetrics > | |
TrackingAllocator (metric::Token token, TrackingAllocator< OtherMetrics > &parent, const AddTrackingAllocatorAsChild &) | |
const metric::Group & | metric_group () const |
metric::Group & | metric_group () |
const MetricsType & | metrics () const |
void | UpdateDeferred () const |
![]() | |
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 | |
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 |
void * | DoReallocate (void *ptr, Layout new_layout) override |
size_t | DoGetAllocated () const override |
Result< Layout > | DoGetInfo (InfoType info_type, const void *ptr) const override |
Additional Inherited Members | |
![]() | |
using | Capabilities = allocator::Capabilities |
using | Capability = allocator::Capability |
using | Layout = allocator::Layout |
![]() | |
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 T > | |
static constexpr bool | is_bounded_array_v |
template<typename T > | |
static constexpr bool | is_unbounded_array_v |
Wraps an Allocator
and records details of its usage.
Metric collection is performed using the provided template parameter type. Callers can not instantiate this class directly, as it lacks a public constructor. Instead, callers should use derived classes which provide the template parameter type, such as TrackingAllocator
which uses the default metrics implementation, or TrackingAllocatorForTest
which always uses the real metrics implementation.
|
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.
|
inlineoverrideprivate |
|
overrideprivatevirtual |
Modifies the size of a previously-allocated block of memory.
Returns pointer to the modified block of memory, or nullptr
if the memory could not be modified.
The data stored by the memory being modified must be trivially copyable. If it is not, callers should themselves attempt to Resize
, then Allocate
, move the data, and Deallocate
as needed.
If nullptr
is returned, the block of memory is unchanged. In particular, if the new_layout
has a size of 0, the given pointer will NOT be deallocated.
TODO(b/331290408): This error condition needs to be better communicated to module users, who may assume the pointer is freed.
Unlike Resize
, providing a null pointer will return a new allocation.
If the request can be satisfied using Resize
, the alignment
parameter may be ignored.
[in] | ptr | Pointer to previously-allocated memory. |
[in] | new_layout | Describes the memory to be allocated. |
Reimplemented from pw::Allocator.
|
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.
|
inline |
Requests to update out-of-band metrics, if any.
See also NoMetrics::UpdateDeferred
.