mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-21 02:43:33 +08:00
Heap based pool allocator - configurable getNumBlocks()
This commit is contained in:
@@ -49,6 +49,7 @@ class UAVCAN_EXPORT HeapBasedPoolAllocator : public IPoolAllocator, Noncopyable
|
|||||||
};
|
};
|
||||||
|
|
||||||
Node* volatile cache_;
|
Node* volatile cache_;
|
||||||
|
uint16_t reported_num_blocks_;
|
||||||
|
|
||||||
Node* popCache()
|
Node* popCache()
|
||||||
{
|
{
|
||||||
@@ -73,7 +74,10 @@ public:
|
|||||||
/**
|
/**
|
||||||
* The allocator initializes with empty cache, so first allocations will be served from heap.
|
* The allocator initializes with empty cache, so first allocations will be served from heap.
|
||||||
*/
|
*/
|
||||||
HeapBasedPoolAllocator() : cache_(NULL) { }
|
HeapBasedPoolAllocator(uint16_t reported_num_blocks) :
|
||||||
|
cache_(NULL),
|
||||||
|
reported_num_blocks_(reported_num_blocks)
|
||||||
|
{ }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The destructor de-allocates all blocks that are currently in the cache.
|
* The destructor de-allocates all blocks that are currently in the cache.
|
||||||
@@ -121,9 +125,10 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Heap-based pool is virutally infinite in size, so this method just returns maximum possible number of blocks.
|
* Heap-based pool is virutally infinite in size, so this method just returns some pre-defined value.
|
||||||
*/
|
*/
|
||||||
virtual uint16_t getNumBlocks() const { return NumericTraits<uint16_t>::max(); }
|
virtual uint16_t getNumBlocks() const { return reported_num_blocks_; }
|
||||||
|
void setReportedNumBlocks(uint16_t x) { reported_num_blocks_ = x; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Frees all blocks that are not in use at the moment.
|
* Frees all blocks that are not in use at the moment.
|
||||||
|
|||||||
@@ -16,10 +16,14 @@ TEST(HeapBasedPoolAllocator, Basic)
|
|||||||
std::cout << ">>> HEAP BEFORE:" << std::endl;
|
std::cout << ">>> HEAP BEFORE:" << std::endl;
|
||||||
malloc_stats();
|
malloc_stats();
|
||||||
|
|
||||||
uavcan::HeapBasedPoolAllocator<uavcan::MemPoolBlockSize, atomicCompareAndSwap> al;
|
uavcan::HeapBasedPoolAllocator<uavcan::MemPoolBlockSize, atomicCompareAndSwap> al(64);
|
||||||
|
|
||||||
ASSERT_EQ(0, al.getNumCachedBlocks());
|
ASSERT_EQ(0, al.getNumCachedBlocks());
|
||||||
|
|
||||||
|
ASSERT_EQ(64, al.getNumBlocks());
|
||||||
|
al.setReportedNumBlocks(123);
|
||||||
|
ASSERT_EQ(123, al.getNumBlocks());
|
||||||
|
|
||||||
void* a = al.allocate(10);
|
void* a = al.allocate(10);
|
||||||
void* b = al.allocate(10);
|
void* b = al.allocate(10);
|
||||||
void* c = al.allocate(10);
|
void* c = al.allocate(10);
|
||||||
@@ -77,7 +81,7 @@ TEST(HeapBasedPoolAllocator, Concurrency)
|
|||||||
std::cout << ">>> HEAP BEFORE:" << std::endl;
|
std::cout << ">>> HEAP BEFORE:" << std::endl;
|
||||||
malloc_stats();
|
malloc_stats();
|
||||||
|
|
||||||
uavcan::HeapBasedPoolAllocator<uavcan::MemPoolBlockSize, atomicCompareAndSwapWithRescheduling> al;
|
uavcan::HeapBasedPoolAllocator<uavcan::MemPoolBlockSize, atomicCompareAndSwapWithRescheduling> al(1);
|
||||||
|
|
||||||
volatile bool terminate = false;
|
volatile bool terminate = false;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user