21#include "pw_assert/assert.h"
22#include "pw_bytes/span.h"
23#include "pw_multibuf/chunk.h"
25namespace pw::multibuf {
43 std::optional<OwnedChunk>
GetChunk(
size_t size) {
44 PW_DASSERT(size <= region_.size());
48 if (chunk.has_value() && size < region_.size()) {
49 (*chunk)->Truncate(size);
56 PW_ASSERT(!chunk_in_use_);
59 ByteSpan
Region() const final {
return region_; }
63 if (!chunk_in_use_.compare_exchange_strong(in_use,
true)) {
66 return &chunk_storage_;
70 PW_ASSERT(chunk == chunk_storage_.data());
72 std::memset(chunk_storage_.data(), 0, chunk_storage_.size());
73 std::memset(region_.data(), 0, region_.size());
74 chunk_in_use_ =
false;
79 std::atomic<bool> chunk_in_use_ =
false;
80 alignas(
Chunk) std::array<std::byte,
sizeof(
Chunk)> chunk_storage_;
std::optional< OwnedChunk > CreateFirstChunk()
Definition: single_chunk_region_tracker.h:30
void DeallocateChunkClass(void *chunk) final
Deallocates a pointer returned by AllocateChunkClass.
Definition: single_chunk_region_tracker.h:69
ByteSpan Region() const final
Definition: single_chunk_region_tracker.h:59
SingleChunkRegionTracker(ByteSpan region)
Definition: single_chunk_region_tracker.h:34
void Destroy() final
Definition: single_chunk_region_tracker.h:54
void * AllocateChunkClass() final
Definition: single_chunk_region_tracker.h:61
std::optional< OwnedChunk > GetChunk(size_t size)
Definition: single_chunk_region_tracker.h:43