21#include "pw_assert/assert.h"
22#include "pw_bytes/span.h"
23#include "pw_multibuf/chunk.h"
24#include "pw_multibuf/config.h"
26namespace pw::multibuf {
47 std::optional<OwnedChunk>
GetChunk(
size_t size) {
48 PW_DASSERT(size <= region_.size());
51 std::optional<OwnedChunk> chunk = CreateFirstChunk();
52 if (chunk.has_value() && size < region_.size()) {
53 (*chunk)->Truncate(size);
60 PW_ASSERT(!chunk_in_use_);
67 if (!chunk_in_use_.compare_exchange_strong(in_use,
true)) {
70 return &chunk_storage_;
74 PW_ASSERT(chunk == chunk_storage_.data());
76 std::memset(chunk_storage_.data(), 0, chunk_storage_.size());
77 std::memset(region_.data(), 0, region_.size());
78 chunk_in_use_ =
false;
83 std::atomic<bool> chunk_in_use_ =
false;
84 alignas(
Chunk) std::array<std::byte,
sizeof(
Chunk)> chunk_storage_;
Definition: single_chunk_region_tracker.h:34
void DeallocateChunkClass(void *chunk) final
Deallocates a pointer returned by AllocateChunkClass.
Definition: single_chunk_region_tracker.h:73
ByteSpan Region() const final
Definition: single_chunk_region_tracker.h:63
SingleChunkRegionTracker(ByteSpan region)
Definition: single_chunk_region_tracker.h:38
void Destroy() final
Definition: single_chunk_region_tracker.h:58
void * AllocateChunkClass() final
Definition: single_chunk_region_tracker.h:65
std::optional< OwnedChunk > GetChunk(size_t size)
Definition: single_chunk_region_tracker.h:47