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_; }
95 constexpr void Reset() {}
101 ContiguityRequirement contiguity_requirement)
final;
104 return data_area_.size();
116 struct FreeBlock final {
120 IntrusiveList<internal::LinkedRegionTracker>::iterator iter;
130 struct AvailableMemorySize final {
139 AvailableMemorySize GetAvailableMemorySize()
143 enum class ControlFlow {
153 template <
typename Fn>
155 std::byte* last_used_end = data_area_.data();
158 auto prev_iter = regions_.before_begin();
161 auto cur_iter = prev_iter;
163 if (cur_iter == regions_.end()) {
167 static_cast<size_t>(cur_iter->region_.data() - last_used_end);
169 ControlFlow cf = function({prev_iter, ByteSpan(last_used_end, unused)});
170 if (cf == ControlFlow::Break) {
174 last_used_end = cur_iter->region_.data() + cur_iter->region_.size();
175 prev_iter = cur_iter;
177 size_t unused =
static_cast<size_t>(
178 (data_area_.data() + data_area_.size()) - last_used_end);
180 function({prev_iter, ByteSpan(last_used_end, unused)});
185 IntrusiveList<internal::LinkedRegionTracker> regions_
PW_GUARDED_BY(lock_);
187 const ByteSpan data_area_;
188 const size_t alignment_;
190 friend class internal::LinkedRegionTracker;
Definition: allocator.h:42
Definition: intrusive_list.h:88
Definition: allocator.h:57
A simple first-fit MultiBufAllocator.
Definition: simple_allocator.h:62
SimpleAllocator(ByteSpan data_area, pw::Allocator &metadata_alloc, size_t alignment=1)
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:103
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:147
The Pigweed namespace.
Definition: alignment.h:27