mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-30 06:03:34 +08:00
Transfer buffer: removed timestamps and cleanup()
This commit is contained in:
@@ -20,21 +20,9 @@ namespace uavcan
|
|||||||
*/
|
*/
|
||||||
class TransferBufferBase : Noncopyable
|
class TransferBufferBase : Noncopyable
|
||||||
{
|
{
|
||||||
uint64_t update_timestamp_;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
void reset() { update_timestamp_ = 0; }
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
TransferBufferBase()
|
|
||||||
: update_timestamp_(0)
|
|
||||||
{ }
|
|
||||||
|
|
||||||
virtual ~TransferBufferBase() { }
|
virtual ~TransferBufferBase() { }
|
||||||
|
|
||||||
uint64_t getUpdateTimestamp() const { return update_timestamp_; }
|
|
||||||
void setUpdateTimestamp(uint64_t val) { update_timestamp_ = val; }
|
|
||||||
|
|
||||||
virtual int read(unsigned int offset, uint8_t* data, unsigned int len) const = 0;
|
virtual int read(unsigned int offset, uint8_t* data, unsigned int len) const = 0;
|
||||||
virtual int write(unsigned int offset, const uint8_t* data, unsigned int len) = 0;
|
virtual int write(unsigned int offset, const uint8_t* data, unsigned int len) = 0;
|
||||||
};
|
};
|
||||||
@@ -60,7 +48,6 @@ public:
|
|||||||
void reset(uint8_t node_id = NODE_ID_INVALID)
|
void reset(uint8_t node_id = NODE_ID_INVALID)
|
||||||
{
|
{
|
||||||
node_id_ = node_id;
|
node_id_ = node_id;
|
||||||
TransferBufferBase::reset();
|
|
||||||
resetImpl();
|
resetImpl();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -183,7 +170,6 @@ public:
|
|||||||
|
|
||||||
// Resetting self and moving all data from the source
|
// Resetting self and moving all data from the source
|
||||||
reset(tbme->getNodeID());
|
reset(tbme->getNodeID());
|
||||||
setUpdateTimestamp(tbme->getUpdateTimestamp());
|
|
||||||
const int res = tbme->read(0, data_, SIZE);
|
const int res = tbme->read(0, data_, SIZE);
|
||||||
if (res < 0)
|
if (res < 0)
|
||||||
{
|
{
|
||||||
@@ -215,7 +201,6 @@ public:
|
|||||||
virtual TransferBufferBase* access(uint8_t node_id) = 0;
|
virtual TransferBufferBase* access(uint8_t node_id) = 0;
|
||||||
virtual TransferBufferBase* create(uint8_t node_id) = 0;
|
virtual TransferBufferBase* create(uint8_t node_id) = 0;
|
||||||
virtual void remove(uint8_t node_id) = 0;
|
virtual void remove(uint8_t node_id) = 0;
|
||||||
virtual void cleanup(uint64_t oldest_timestamp) = 0;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -267,7 +252,6 @@ class TransferBufferManager : public ITransferBufferManager, Noncopyable
|
|||||||
if (sb->migrateFrom(dyn))
|
if (sb->migrateFrom(dyn))
|
||||||
{
|
{
|
||||||
assert(!dyn->isEmpty());
|
assert(!dyn->isEmpty());
|
||||||
assert(dyn->getUpdateTimestamp() == sb->getUpdateTimestamp());
|
|
||||||
UAVCAN_TRACE("TransferBufferManager", "Storage optimization: Migrated NID %i", int(dyn->getNodeID()));
|
UAVCAN_TRACE("TransferBufferManager", "Storage optimization: Migrated NID %i", int(dyn->getNodeID()));
|
||||||
dynamic_buffers_.remove(dyn);
|
dynamic_buffers_.remove(dyn);
|
||||||
DynamicTransferBuffer::destroy(dyn, allocator_);
|
DynamicTransferBuffer::destroy(dyn, allocator_);
|
||||||
@@ -293,7 +277,14 @@ public:
|
|||||||
|
|
||||||
~TransferBufferManager()
|
~TransferBufferManager()
|
||||||
{
|
{
|
||||||
cleanup(std::numeric_limits<uint64_t>::max());
|
DynamicTransferBuffer* dyn = dynamic_buffers_.get();
|
||||||
|
while (dyn)
|
||||||
|
{
|
||||||
|
DynamicTransferBuffer* const next = dyn->getNextListNode();
|
||||||
|
dynamic_buffers_.remove(dyn);
|
||||||
|
DynamicTransferBuffer::destroy(dyn, allocator_);
|
||||||
|
dyn = next;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int getNumDynamicBuffers() const { return dynamic_buffers_.length(); }
|
unsigned int getNumDynamicBuffers() const { return dynamic_buffers_.length(); }
|
||||||
@@ -368,40 +359,6 @@ public:
|
|||||||
DynamicTransferBuffer::destroy(dyn, allocator_);
|
DynamicTransferBuffer::destroy(dyn, allocator_);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void cleanup(uint64_t oldest_timestamp)
|
|
||||||
{
|
|
||||||
int num_released_statics = 0;
|
|
||||||
for (unsigned int i = 0; i < NUM_STATIC_BUFS; i++)
|
|
||||||
{
|
|
||||||
TransferBufferManagerEntry* const buf = static_buffers_ + i;
|
|
||||||
if (buf->isEmpty())
|
|
||||||
continue;
|
|
||||||
if (buf->getUpdateTimestamp() <= oldest_timestamp)
|
|
||||||
{
|
|
||||||
UAVCAN_TRACE("TransferBufferManager", "Cleanup: Dead static buffer, NID %i", int(buf->getNodeID()));
|
|
||||||
buf->reset();
|
|
||||||
num_released_statics++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
DynamicTransferBuffer* dyn = dynamic_buffers_.get();
|
|
||||||
while (dyn)
|
|
||||||
{
|
|
||||||
assert(!dyn->isEmpty());
|
|
||||||
DynamicTransferBuffer* const next = dyn->getNextListNode();
|
|
||||||
if (dyn->getUpdateTimestamp() <= oldest_timestamp)
|
|
||||||
{
|
|
||||||
UAVCAN_TRACE("TransferBufferManager", "Cleanup: Dead dynamic buffer, NID %i", int(dyn->getNodeID()));
|
|
||||||
dynamic_buffers_.remove(dyn);
|
|
||||||
DynamicTransferBuffer::destroy(dyn, allocator_);
|
|
||||||
}
|
|
||||||
dyn = next;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (num_released_statics > 0)
|
|
||||||
optimizeStorage();
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -250,13 +250,11 @@ TEST(TransferBufferManager, Basic)
|
|||||||
|
|
||||||
// Static 0
|
// Static 0
|
||||||
ASSERT_TRUE((tbb = mgr->create(0)));
|
ASSERT_TRUE((tbb = mgr->create(0)));
|
||||||
tbb->setUpdateTimestamp(1234);
|
|
||||||
ASSERT_EQ(MGR_STATIC_BUFFER_SIZE, fillTestData(MGR_TEST_DATA[0], tbb));
|
ASSERT_EQ(MGR_STATIC_BUFFER_SIZE, fillTestData(MGR_TEST_DATA[0], tbb));
|
||||||
ASSERT_EQ(1, mgr->getNumStaticBuffers());
|
ASSERT_EQ(1, mgr->getNumStaticBuffers());
|
||||||
|
|
||||||
// Static 1
|
// Static 1
|
||||||
ASSERT_TRUE((tbb = mgr->create(1)));
|
ASSERT_TRUE((tbb = mgr->create(1)));
|
||||||
tbb->setUpdateTimestamp(2345);
|
|
||||||
ASSERT_EQ(MGR_STATIC_BUFFER_SIZE, fillTestData(MGR_TEST_DATA[1], tbb));
|
ASSERT_EQ(MGR_STATIC_BUFFER_SIZE, fillTestData(MGR_TEST_DATA[1], tbb));
|
||||||
ASSERT_EQ(2, mgr->getNumStaticBuffers());
|
ASSERT_EQ(2, mgr->getNumStaticBuffers());
|
||||||
ASSERT_EQ(0, mgr->getNumDynamicBuffers());
|
ASSERT_EQ(0, mgr->getNumDynamicBuffers());
|
||||||
@@ -265,7 +263,6 @@ TEST(TransferBufferManager, Basic)
|
|||||||
// Dynamic 0
|
// Dynamic 0
|
||||||
ASSERT_TRUE((tbb = mgr->create(2)));
|
ASSERT_TRUE((tbb = mgr->create(2)));
|
||||||
ASSERT_EQ(1, pool.getNumUsedBlocks()); // Empty dynamic buffer occupies one block
|
ASSERT_EQ(1, pool.getNumUsedBlocks()); // Empty dynamic buffer occupies one block
|
||||||
tbb->setUpdateTimestamp(3456);
|
|
||||||
ASSERT_EQ(MGR_TEST_DATA[2].length(), fillTestData(MGR_TEST_DATA[2], tbb));
|
ASSERT_EQ(MGR_TEST_DATA[2].length(), fillTestData(MGR_TEST_DATA[2], tbb));
|
||||||
ASSERT_EQ(2, mgr->getNumStaticBuffers());
|
ASSERT_EQ(2, mgr->getNumStaticBuffers());
|
||||||
ASSERT_EQ(1, mgr->getNumDynamicBuffers());
|
ASSERT_EQ(1, mgr->getNumDynamicBuffers());
|
||||||
@@ -276,7 +273,6 @@ TEST(TransferBufferManager, Basic)
|
|||||||
// Dynamic 2
|
// Dynamic 2
|
||||||
ASSERT_TRUE((tbb = mgr->create(127)));
|
ASSERT_TRUE((tbb = mgr->create(127)));
|
||||||
ASSERT_EQ(0, pool.getNumFreeBlocks()); // The test assumes that the memory must be exhausted now
|
ASSERT_EQ(0, pool.getNumFreeBlocks()); // The test assumes that the memory must be exhausted now
|
||||||
tbb->setUpdateTimestamp(4567);
|
|
||||||
|
|
||||||
ASSERT_EQ(0, fillTestData(MGR_TEST_DATA[3], tbb));
|
ASSERT_EQ(0, fillTestData(MGR_TEST_DATA[3], tbb));
|
||||||
ASSERT_EQ(2, mgr->getNumStaticBuffers());
|
ASSERT_EQ(2, mgr->getNumStaticBuffers());
|
||||||
@@ -289,19 +285,15 @@ TEST(TransferBufferManager, Basic)
|
|||||||
|
|
||||||
// Making sure all buffers contain proper data
|
// Making sure all buffers contain proper data
|
||||||
ASSERT_TRUE((tbb = mgr->access(0)));
|
ASSERT_TRUE((tbb = mgr->access(0)));
|
||||||
ASSERT_EQ(1234, tbb->getUpdateTimestamp());
|
|
||||||
ASSERT_TRUE(matchAgainst(MGR_TEST_DATA[0], *tbb));
|
ASSERT_TRUE(matchAgainst(MGR_TEST_DATA[0], *tbb));
|
||||||
|
|
||||||
ASSERT_TRUE((tbb = mgr->access(1)));
|
ASSERT_TRUE((tbb = mgr->access(1)));
|
||||||
ASSERT_EQ(2345, tbb->getUpdateTimestamp());
|
|
||||||
ASSERT_TRUE(matchAgainst(MGR_TEST_DATA[1], *tbb));
|
ASSERT_TRUE(matchAgainst(MGR_TEST_DATA[1], *tbb));
|
||||||
|
|
||||||
ASSERT_TRUE((tbb = mgr->access(2)));
|
ASSERT_TRUE((tbb = mgr->access(2)));
|
||||||
ASSERT_EQ(3456, tbb->getUpdateTimestamp());
|
|
||||||
ASSERT_TRUE(matchAgainst(MGR_TEST_DATA[2], *tbb));
|
ASSERT_TRUE(matchAgainst(MGR_TEST_DATA[2], *tbb));
|
||||||
|
|
||||||
ASSERT_TRUE((tbb = mgr->access(127)));
|
ASSERT_TRUE((tbb = mgr->access(127)));
|
||||||
ASSERT_EQ(4567, tbb->getUpdateTimestamp());
|
|
||||||
ASSERT_TRUE(matchAgainst(MGR_TEST_DATA[3], *tbb));
|
ASSERT_TRUE(matchAgainst(MGR_TEST_DATA[3], *tbb));
|
||||||
|
|
||||||
// Freeing one static buffer; one dynamic must migrate
|
// Freeing one static buffer; one dynamic must migrate
|
||||||
@@ -311,19 +303,17 @@ TEST(TransferBufferManager, Basic)
|
|||||||
ASSERT_EQ(1, mgr->getNumDynamicBuffers()); // One migrated to the static
|
ASSERT_EQ(1, mgr->getNumDynamicBuffers()); // One migrated to the static
|
||||||
ASSERT_LT(0, pool.getNumFreeBlocks());
|
ASSERT_LT(0, pool.getNumFreeBlocks());
|
||||||
|
|
||||||
// Cleanup must remove NodeID 0 due to low timestamp; migration should fail due to oversized data
|
// Removing NodeID 0; migration should fail due to oversized data
|
||||||
mgr->cleanup(2000);
|
mgr->remove(0);
|
||||||
ASSERT_FALSE(mgr->access(0));
|
ASSERT_FALSE(mgr->access(0));
|
||||||
ASSERT_EQ(1, mgr->getNumStaticBuffers());
|
ASSERT_EQ(1, mgr->getNumStaticBuffers());
|
||||||
ASSERT_EQ(1, mgr->getNumDynamicBuffers()); // Migration failed
|
ASSERT_EQ(1, mgr->getNumDynamicBuffers()); // Migration failed
|
||||||
|
|
||||||
// At this time we have the following NodeID: 2, 127
|
// At this time we have the following NodeID: 2, 127
|
||||||
ASSERT_TRUE((tbb = mgr->access(2)));
|
ASSERT_TRUE((tbb = mgr->access(2)));
|
||||||
ASSERT_EQ(3456, tbb->getUpdateTimestamp());
|
|
||||||
ASSERT_TRUE(matchAgainst(MGR_TEST_DATA[2], *tbb));
|
ASSERT_TRUE(matchAgainst(MGR_TEST_DATA[2], *tbb));
|
||||||
|
|
||||||
ASSERT_TRUE((tbb = mgr->access(127)));
|
ASSERT_TRUE((tbb = mgr->access(127)));
|
||||||
ASSERT_EQ(4567, tbb->getUpdateTimestamp());
|
|
||||||
ASSERT_TRUE(matchAgainst(MGR_TEST_DATA[3], *tbb));
|
ASSERT_TRUE(matchAgainst(MGR_TEST_DATA[3], *tbb));
|
||||||
|
|
||||||
// These were deleted: 0, 1
|
// These were deleted: 0, 1
|
||||||
|
|||||||
Reference in New Issue
Block a user