16#include "pw_allocator/allocator.h"
17#include "pw_containers/intrusive_list.h"
18#include "pw_multibuf/config.h"
19#include "pw_multibuf/v1/allocator.h"
20#include "pw_multibuf/v1/multibuf.h"
22namespace pw::multibuf::v1 {
35 : parent_(parent), region_(region) {}
46 ByteSpan Region() const final {
return region_; }
48 void DeallocateChunkClass(
void*) final;
67 static constexpr size_t kAllocationOverhead = 0;
85 size_t alignment = 1);
91 constexpr size_t alignment()
const {
return alignment_; }
97 ContiguityRequirement contiguity_requirement)
final;
100 return data_area_.size();
112 struct FreeBlock final {
116 IntrusiveList<internal::LinkedRegionTracker>::iterator iter;
126 struct AvailableMemorySize final {
135 AvailableMemorySize GetAvailableMemorySize()
139 enum class ControlFlow {
149 template <
typename Fn>
151 std::byte* last_used_end = data_area_.data();
154 auto prev_iter = regions_.before_begin();
157 auto cur_iter = prev_iter;
159 if (cur_iter == regions_.end()) {
163 static_cast<size_t>(cur_iter->region_.data() - last_used_end);
165 ControlFlow cf = function({prev_iter, ByteSpan(last_used_end, unused)});
166 if (cf == ControlFlow::Break) {
170 last_used_end = cur_iter->region_.data() + cur_iter->region_.size();
171 prev_iter = cur_iter;
173 size_t unused =
static_cast<size_t>(
174 (data_area_.data() + data_area_.size()) - last_used_end);
176 function({prev_iter, ByteSpan(last_used_end, unused)});
181 IntrusiveList<internal::LinkedRegionTracker> regions_
PW_GUARDED_BY(lock_);
183 const ByteSpan data_area_;
184 const size_t alignment_;
186 friend class internal::LinkedRegionTracker;
Definition: allocator.h:45
Definition: intrusive_list.h:88
Definition: allocator.h:57
A simple first-fit MultiBufAllocator.
Definition: simple_allocator.h:62
pw::Result< MultiBuf > DoAllocate(size_t min_size, size_t desired_size, ContiguityRequirement contiguity_requirement) final
constexpr size_t alignment() const
Definition: simple_allocator.h:91
std::optional< size_t > DoGetBackingCapacity() final
Definition: simple_allocator.h:99
SimpleAllocator(ByteSpan data_area, pw::allocator::Allocator &metadata_alloc, size_t alignment=1)
Definition: simple_allocator.h:32
void * AllocateChunkClass() final
#define PW_GUARDED_BY(x)
Definition: lock_annotations.h:60
#define PW_EXCLUSIVE_LOCKS_REQUIRED(...)
Definition: lock_annotations.h:146
The Pigweed namespace.
Definition: alignment.h:27