18#include "pw_allocator/allocator.h"
19#include "pw_allocator/layout.h"
20#include "pw_allocator/synchronized_allocator.h"
21#include "pw_result/result.h"
22#include "pw_sync/borrow.h"
24namespace pw::allocator {
76 static void*
AddPrefix(
void* ptr,
size_t alignment);
116template <
typename BlockAllocatorType,
typename LockType = NoSync>
122 using BlockType =
typename BlockAllocatorType::BlockType;
125 :
Base(allocator.capabilities()), borrowable_(allocator, lock_) {
126 block_ = *(allocator.blocks().end());
160 bool DoResize(
void* ptr,
size_t new_size)
override;
178template <
typename BlockAllocatorType,
typename LockType>
180 auto allocator = borrowable_.acquire();
183 auto range = allocator->blocks();
184 BlockType* begin = *(range.begin());
185 BlockType* end = *(range.end());
193 if (block_ ==
nullptr || block_ == end) {
198 BlockType* prev = block_;
199 while (!block_->Used()) {
200 BlockType* next = block_->Next();
213 void* ptr = block_->UsableSpace();
214 size_t size = block_->InnerSize();
215 return Base::CheckPrefixAndSuffix(ptr, size) ? nullptr : ptr;
218template <
typename BlockAllocatorType,
typename LockType>
220 auto allocator = borrowable_.acquire();
221 for (BlockType* block : allocator->blocks()) {
222 if (!block->Used()) {
225 void* ptr = block->UsableSpace();
226 size_t size = block->InnerSize();
227 if (!Base::CheckPrefixAndSuffix(ptr, size)) {
234template <
typename BlockAllocatorType,
typename LockType>
237 layout = Base::AdjustLayout(layout);
238 auto allocator = borrowable_.acquire();
239 void* ptr = allocator->Allocate(layout);
240 if (ptr ==
nullptr) {
243 auto* block = BlockType::FromUsableSpace(ptr);
246 BlockType* prev = block->Prev();
247 if (prev !=
nullptr && prev->Used()) {
248 Base::AddSuffix(prev->UsableSpace(), prev->InnerSize());
251 Base::AddSuffix(block->UsableSpace(), block->InnerSize());
252 return Base::AddPrefix(ptr, layout.alignment());
255template <
typename BlockAllocatorType,
typename LockType>
257 ptr = Base::GetOriginal(ptr);
260 auto allocator = borrowable_.acquire();
261 auto* block = BlockType::FromUsableSpace(ptr);
262 BlockType* prev = block->Prev();
263 if (block_ == block || block_ == block->Next()) {
266 allocator->Deallocate(ptr);
269 if (prev !=
nullptr && prev->Used()) {
270 Base::AddSuffix(prev->UsableSpace(), prev->InnerSize());
274template <
typename BlockAllocatorType,
typename LockType>
277 ptr = Base::GetOriginal(ptr);
278 new_size = Base::AdjustSize(ptr, new_size);
281 auto allocator = borrowable_.acquire();
282 auto* block = BlockType::FromUsableSpace(ptr);
283 if (block_ == block->Next()) {
286 if (!allocator->Resize(ptr, new_size)) {
289 Base::AddSuffix(block->UsableSpace(), block->InnerSize());
293template <
typename BlockAllocatorType,
typename LockType>
295 InfoType info_type,
const void* ptr)
const {
296 ptr =
const_cast<const void*
>(Base::GetOriginal(
const_cast<void*
>(ptr)));
297 auto allocator = borrowable_.acquire();
298 return BlockAllocatorType::GetInfo(*allocator, info_type, ptr);
Definition: allocator.h:36
constexpr Allocator()=default
TODO(b/326509341): Remove when downstream consumers migrate.
Definition: capability.h:64
Definition: guarded_allocator.h:117
void DoDeallocate(void *ptr) override
Definition: guarded_allocator.h:256
void * ValidateAll()
Definition: guarded_allocator.h:219
bool DoResize(void *ptr, size_t new_size) override
Definition: guarded_allocator.h:275
void * DoAllocate(Layout layout) override
Definition: guarded_allocator.h:235
void DoDeallocate(void *ptr, Layout) override
Definition: guarded_allocator.h:157
Result< Layout > DoGetInfo(InfoType info_type, const void *ptr) const override
Definition: guarded_allocator.h:294
void * ValidateOne()
Definition: guarded_allocator.h:179
Definition: guarded_allocator.h:53
static size_t AdjustSize(void *ptr, size_t inner_size)
static void AddSuffix(void *ptr, size_t size)
Adds a suffix a the end of the allocation given by ptr and size.
static void * AddPrefix(void *ptr, size_t alignment)
static void * GetOriginal(void *ptr)
static bool CheckPrefixAndSuffix(void *ptr, size_t size)
static Layout AdjustLayout(Layout layout)