16#include "pw_allocator/allocator.h"
17#include "pw_containers/intrusive_list.h"
18#include "pw_multibuf/allocator.h"
19#include "pw_multibuf/multibuf.h"
21namespace pw::multibuf {
34 : parent_(parent), region_(region) {}
45 ByteSpan
Region() const final {
return region_; }
51 const ByteSpan region_;
77 size_t alignment = 1);
83 ContiguityRequirement contiguity_requirement)
final;
86 return data_area_.size();
90 pw::Result<MultiBuf> InternalAllocateContiguous(
size_t size)
91 PW_EXCLUSIVE_LOCKS_REQUIRED(lock_);
98 struct FreeBlock final {
102 IntrusiveList<internal::LinkedRegionTracker>::iterator iter;
108 pw::Result<OwnedChunk> InsertRegion(
const FreeBlock&)
109 PW_EXCLUSIVE_LOCKS_REQUIRED(lock_);
112 struct AvailableMemorySize final {
121 AvailableMemorySize GetAvailableMemorySize()
122 PW_EXCLUSIVE_LOCKS_REQUIRED(lock_);
125 enum class ControlFlow {
135 template <
typename Fn>
136 void ForEachFreeBlock(Fn function) PW_EXCLUSIVE_LOCKS_REQUIRED(lock_) {
137 std::byte* last_used_end = data_area_.data();
140 auto prev_iter = regions_.before_begin();
143 auto cur_iter = prev_iter;
145 if (cur_iter == regions_.end()) {
148 size_t unused = cur_iter->region_.data() - last_used_end;
150 ControlFlow cf = function({prev_iter, ByteSpan(last_used_end, unused)});
151 if (cf == ControlFlow::Break) {
155 last_used_end = cur_iter->region_.data() + cur_iter->region_.size();
156 prev_iter = cur_iter;
158 size_t unused = (data_area_.data() + data_area_.size()) - last_used_end;
160 function({prev_iter, ByteSpan(last_used_end, unused)});
165 IntrusiveList<internal::LinkedRegionTracker> regions_ PW_GUARDED_BY(lock_);
167 const ByteSpan data_area_;
168 const size_t alignment_;
170 friend class internal::LinkedRegionTracker;
Definition: allocator.h:34
Definition: intrusive_list.h:82
Definition: allocator.h:54
A simple first-fit MultiBufAllocator.
Definition: simple_allocator.h:59
SimpleAllocator(ByteSpan data_area, pw::allocator::Allocator &metadata_alloc, size_t alignment=1)
pw::Result< MultiBuf > DoAllocate(size_t min_size, size_t desired_size, ContiguityRequirement contiguity_requirement) final
std::optional< size_t > DoGetBackingCapacity() final
Definition: simple_allocator.h:85
Definition: simple_allocator.h:31
void * AllocateChunkClass() final
ByteSpan Region() const final
Definition: simple_allocator.h:45
void DeallocateChunkClass(void *) final
Deallocates a pointer returned by AllocateChunkClass.
Provides basic helpers for reading and writing UTF-8 encoded strings.
Definition: alignment.h:27