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;
80 size_t alignment = 1);
86 ContiguityRequirement contiguity_requirement)
final;
89 return data_area_.size();
101 struct FreeBlock final {
105 IntrusiveList<internal::LinkedRegionTracker>::iterator iter;
115 struct AvailableMemorySize final {
124 AvailableMemorySize GetAvailableMemorySize()
128 enum class ControlFlow {
138 template <
typename Fn>
140 std::byte* last_used_end = data_area_.data();
143 auto prev_iter = regions_.before_begin();
146 auto cur_iter = prev_iter;
148 if (cur_iter == regions_.end()) {
152 static_cast<size_t>(cur_iter->region_.data() - last_used_end);
154 ControlFlow cf = function({prev_iter, ByteSpan(last_used_end, unused)});
155 if (cf == ControlFlow::Break) {
159 last_used_end = cur_iter->region_.data() + cur_iter->region_.size();
160 prev_iter = cur_iter;
162 size_t unused =
static_cast<size_t>(
163 (data_area_.data() + data_area_.size()) - last_used_end);
165 function({prev_iter, ByteSpan(last_used_end, unused)});
170 IntrusiveList<internal::LinkedRegionTracker> regions_
PW_GUARDED_BY(lock_);
172 const ByteSpan data_area_;
173 const size_t alignment_;
175 friend class internal::LinkedRegionTracker;
Definition: allocator.h:36
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::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:88
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