5 #ifndef UAVCAN_DYNAMIC_MEMORY_HPP_INCLUDED 6 #define UAVCAN_DYNAMIC_MEMORY_HPP_INCLUDED 27 virtual void deallocate(
const void* ptr) = 0;
32 virtual uint16_t getBlockCapacity()
const = 0;
73 static const uint16_t NumBlocks = PoolSize / BlockSize;
78 virtual void deallocate(
const void* ptr);
87 RaiiSynchronizer lock;
93 RaiiSynchronizer lock;
95 return static_cast<uint16_t>(NumBlocks - used_);
103 RaiiSynchronizer lock;
120 : allocator_(allocator)
128 virtual void deallocate(
const void* ptr);
130 virtual uint16_t getBlockCapacity()
const;
138 template <std::
size_t PoolSize, u
int8_t BlockSize,
typename RaiiSynchronizer>
141 template <std::
size_t PoolSize, u
int8_t BlockSize,
typename RaiiSynchronizer>
143 free_list_(reinterpret_cast<
Node*>(pool_.bytes)),
148 StaticAssert<((PoolSize / BlockSize) <= 0xFFFFU)>::check();
150 (void)std::memset(pool_.bytes, 0, PoolSize);
151 for (
unsigned i = 0; (i + 1) < (NumBlocks - 1 + 1); i++)
154 free_list_[i].next = free_list_ + i + 1;
159 template <std::
size_t PoolSize, u
int8_t BlockSize,
typename RaiiSynchronizer>
167 RaiiSynchronizer lock;
170 void* pmem = free_list_;
171 free_list_ = free_list_->next;
176 if (used_ > max_used_)
184 template <std::
size_t PoolSize, u
int8_t BlockSize,
typename RaiiSynchronizer>
192 RaiiSynchronizer lock;
195 Node* p =
static_cast<Node*
>(
const_cast<void*
>(ptr));
196 p->next = free_list_;
206 #endif // UAVCAN_DYNAMIC_MEMORY_HPP_INCLUDED
virtual ~IPoolAllocator()
IPoolAllocator & allocator_
uint16_t getNumFreeBlocks() const
uint16_t getPeakNumUsedBlocks() const
LimitedPoolAllocator(IPoolAllocator &allocator, std::size_t max_blocks)
UAVCAN_EXPORT const T & min(const T &a, const T &b)
const uint16_t max_blocks_
virtual uint16_t getBlockCapacity() const
struct UAVCAN_EXPORT StaticAssert
uint16_t getNumUsedBlocks() const