16#include "pw_allocator/allocator.h"
17#include "pw_containers/intrusive_list.h"
18#include "pw_multibuf/allocator.h"
19#include "pw_multibuf/config.h"
20#include "pw_multibuf/multibuf_v1.h"
22namespace pw::multibuf {
35 : parent_(parent), region_(region) {}
46 ByteSpan Region() const final {
return region_; }
48 void DeallocateChunkClass(
void*) final;
52 const ByteSpan region_;
78 size_t alignment = 1);
84 ContiguityRequirement contiguity_requirement)
final;
87 return data_area_.size();
91 pw::Result<MultiBuf> InternalAllocateContiguous(
size_t size)
92 PW_EXCLUSIVE_LOCKS_REQUIRED(lock_);
99 struct FreeBlock final {
103 IntrusiveList<internal::LinkedRegionTracker>::iterator iter;
109 pw::Result<OwnedChunk> InsertRegion(
const FreeBlock&)
110 PW_EXCLUSIVE_LOCKS_REQUIRED(lock_);
113 struct AvailableMemorySize final {
122 AvailableMemorySize GetAvailableMemorySize()
123 PW_EXCLUSIVE_LOCKS_REQUIRED(lock_);
126 enum class ControlFlow {
136 template <
typename Fn>
137 void ForEachFreeBlock(Fn function) PW_EXCLUSIVE_LOCKS_REQUIRED(lock_) {
138 std::byte* last_used_end = data_area_.data();
141 auto prev_iter = regions_.before_begin();
144 auto cur_iter = prev_iter;
146 if (cur_iter == regions_.end()) {
150 static_cast<size_t>(cur_iter->region_.data() - last_used_end);
152 ControlFlow cf = function({prev_iter, ByteSpan(last_used_end, unused)});
153 if (cf == ControlFlow::Break) {
157 last_used_end = cur_iter->region_.data() + cur_iter->region_.size();
158 prev_iter = cur_iter;
160 size_t unused =
static_cast<size_t>(
161 (data_area_.data() + data_area_.size()) - last_used_end);
163 function({prev_iter, ByteSpan(last_used_end, unused)});
168 IntrusiveList<internal::LinkedRegionTracker> regions_ PW_GUARDED_BY(lock_);
170 const ByteSpan data_area_;
171 const size_t alignment_;
173 friend class internal::LinkedRegionTracker;
Definition: allocator.h:34
Definition: intrusive_list.h:82
Definition: allocator.h:55
A simple first-fit MultiBufAllocator.
Definition: simple_allocator.h:60
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:86
Definition: simple_allocator.h:32
void * AllocateChunkClass() final
Provides basic helpers for reading and writing UTF-8 encoded strings.
Definition: alignment.h:27