template<typename BlockAllocatorType, typename LockType = NoSync>
class pw::allocator::GuardedAllocator< BlockAllocatorType, LockType >
GuardedAllocator that can detect heap overflows in a thread-safe manner.
This class takes a BlockAllocator
and manages concurrent access to it. This allows a background thread to validate allocations using one of two key methods:
ValidateOne
will validate a single block each time it is called. Successive calls will eventually iterate over all blocks.
ValidateAll
vill validate all current blocks. Other allocator methods will block until the validation is complete.
Both methods can be called explicitly, or used to create a thread that periodically validates, e.g.
Thread thread(options, [&guarded_allocator]() {
while (true) {
guarded_allocator.ValidateOne();
pw::this_thread::sleep_for(500ms);
}
});
Note that while this allocator wraps a BlockAllocator
it is NOT a block allocator itself. In particular, pointers allocated from this allocator MUST NOT be passed to methods like BlockType::FromUsableSpace
.
|
constexpr | GuardedAllocator (BlockAllocatorType &allocator) |
|
void * | ValidateOne () |
|
void * | ValidateAll () |
|
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_bounded_array_v< T >, int > = 0> |
ElementType * | New () |
|
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) |
| Constructs an alignment -byte aligned array of count objects.
|
|
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 , int &... kExplicitGuard, std::enable_if_t< is_bounded_array_v< T >, int > = 0> |
UniquePtr< T > | MakeUnique () |
|
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<!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> |
SharedPtr< T > | MakeShared () |
|
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 capability is enabled for this object.
|
|
void | Deallocate (void *ptr) |
|
void | Deallocate (void *ptr, Layout layout) |
|
template<typename ElementType > |
void | DeleteArray (ElementType *ptr, size_t count) |
|
StatusWithSize | GetCapacity () const |
|
bool | IsEqual (const Deallocator &other) const |
|
template<typename T , int &... kExplicitGuard, std::enable_if_t<!std::is_array_v< T >, int > = 0> |
void | Delete (T *ptr) |
|
template<typename T , int &... kExplicitGuard, typename ElementType = std::remove_extent_t<T>, std::enable_if_t< is_bounded_array_v< T >, int > = 0> |
void | Delete (ElementType *ptr) |
|
template<typename T , int &... kExplicitGuard, typename ElementType = std::remove_extent_t<T>, std::enable_if_t< is_unbounded_array_v< T >, int > = 0> |
void | Delete (ElementType *ptr, size_t count) |
|
|
constexpr | GenericGuardedAllocator (const 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 , 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) |
|
static Layout | AdjustLayout (Layout layout) |
|
static size_t | AdjustSize (void *ptr, size_t inner_size) |
|
static void * | GetOriginal (void *ptr) |
|
static void * | AddPrefix (void *ptr, size_t alignment) |
|
static void | AddSuffix (void *ptr, size_t size) |
| Adds a suffix a the end of the allocation given by ptr and size .
|
|
static bool | CheckPrefixAndSuffix (void *ptr, size_t size) |
|
template<typename T > |
static constexpr bool | is_bounded_array_v |
|
template<typename T > |
static constexpr bool | is_unbounded_array_v |
|