C/C++ API Reference
Loading...
Searching...
No Matches
allocator.h
1// Copyright 2024 The Pigweed Authors
2//
3// Licensed under the Apache License, Version 2.0 (the "License"); you may not
4// use this file except in compliance with the License. You may obtain a copy of
5// the License at
6//
7// https://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12// License for the specific language governing permissions and limitations under
13// the License.
14#pragma once
15
16#include <cstddef>
17#include <optional>
18
19#include "pw_containers/intrusive_forward_list.h"
20#include "pw_multibuf/config.h"
21#include "pw_multibuf/multibuf_v1.h"
22#include "pw_result/result.h"
23#include "pw_sync/mutex.h"
24
25namespace pw::multibuf {
26
28
29enum class PW_MULTIBUF_DEPRECATED ContiguityRequirement {
30 kAllowDiscontiguous,
31 kNeedsContiguous,
32};
33
34inline constexpr ContiguityRequirement kAllowDiscontiguous =
35 ContiguityRequirement::kAllowDiscontiguous;
36inline constexpr ContiguityRequirement kNeedsContiguous =
37 ContiguityRequirement::kNeedsContiguous;
38
57class PW_MULTIBUF_DEPRECATED MultiBufAllocator {
58 public:
59 MultiBufAllocator() = default;
60
63 MultiBufAllocator& operator=(MultiBufAllocator&) = delete;
65 MultiBufAllocator& operator=(MultiBufAllocator&&) = delete;
66
67 virtual ~MultiBufAllocator() {}
68
78 std::optional<MultiBuf> Allocate(size_t size);
79
90 std::optional<MultiBuf> Allocate(size_t min_size, size_t desired_size);
91
103 std::optional<MultiBuf> AllocateContiguous(size_t size);
104
116 std::optional<MultiBuf> AllocateContiguous(size_t min_size,
117 size_t desired_size);
118
126 std::optional<size_t> GetBackingCapacity() { return DoGetBackingCapacity(); }
127
128 protected:
135 void MoreMemoryAvailable(size_t size_available,
136 size_t contiguous_size_available);
137
138 private:
139 friend class MultiBufAllocationFuture;
140
141 // Instances of this class are informed when more memory becomes available.
142 class MemoryAvailableDelegate
143 : public IntrusiveForwardList<MemoryAvailableDelegate>::Item {
144 public:
145 explicit MemoryAvailableDelegate() = default;
146 MemoryAvailableDelegate(MemoryAvailableDelegate&) = delete;
147 MemoryAvailableDelegate& operator=(MemoryAvailableDelegate&) = delete;
148 MemoryAvailableDelegate(MemoryAvailableDelegate&&) = delete;
149 MemoryAvailableDelegate& operator=(MemoryAvailableDelegate&&) = delete;
150 virtual ~MemoryAvailableDelegate() = default;
151
152 // Callback from allocator when new memory being available. Function should
153 // return true if object's need has been met which also indicates the object
154 // can be released by the allocator.
155 virtual bool HandleMemoryAvailable(MultiBufAllocator& alloc,
156 size_t size_available,
157 size_t contiguous_size_available) const
159 };
160
161 void AddMemoryAvailableDelegate(MemoryAvailableDelegate& delegate)
163 mem_delegates_.push_front(delegate);
164 }
165
166 void RemoveMemoryAvailableDelegate(MemoryAvailableDelegate& delegate)
168 mem_delegates_.remove(delegate);
169 }
170
189 size_t min_size,
190 size_t desired_size,
191 ContiguityRequirement contiguity_requirement) = 0;
192
194 virtual std::optional<size_t> DoGetBackingCapacity() = 0;
195
196 sync::Mutex lock_;
198 PW_GUARDED_BY(lock_);
199};
200
202
203} // namespace pw::multibuf
Definition: intrusive_forward_list.h:91
Definition: poll.h:25
Definition: allocator_async.h:93
Definition: allocator.h:57
std::optional< size_t > GetBackingCapacity()
Definition: allocator.h:126
std::optional< MultiBuf > AllocateContiguous(size_t size)
std::optional< MultiBuf > Allocate(size_t min_size, size_t desired_size)
virtual pw::Result< MultiBuf > DoAllocate(size_t min_size, size_t desired_size, ContiguityRequirement contiguity_requirement)=0
std::optional< MultiBuf > Allocate(size_t size)
virtual std::optional< size_t > DoGetBackingCapacity()=0
MultiBufAllocator(MultiBufAllocator &)=delete
`MultiBufAllocator is not copyable or movable.
std::optional< MultiBuf > AllocateContiguous(size_t min_size, size_t desired_size)
void MoreMemoryAvailable(size_t size_available, size_t contiguous_size_available)
Definition: mutex.h:40
#define PW_GUARDED_BY(x)
Definition: lock_annotations.h:60
#define PW_EXCLUSIVE_LOCKS_REQUIRED(...)
Definition: lock_annotations.h:146