diff --git a/libuavcan/include/uavcan/internal/transport/transfer_buffer.hpp b/libuavcan/include/uavcan/internal/transport/transfer_buffer.hpp index 80862b49c9..0b80e85791 100644 --- a/libuavcan/include/uavcan/internal/transport/transfer_buffer.hpp +++ b/libuavcan/include/uavcan/internal/transport/transfer_buffer.hpp @@ -20,21 +20,9 @@ namespace uavcan */ class TransferBufferBase : Noncopyable { - uint64_t update_timestamp_; - -protected: - void reset() { update_timestamp_ = 0; } - public: - TransferBufferBase() - : update_timestamp_(0) - { } - 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 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) { node_id_ = node_id; - TransferBufferBase::reset(); resetImpl(); } }; @@ -183,7 +170,6 @@ public: // Resetting self and moving all data from the source reset(tbme->getNodeID()); - setUpdateTimestamp(tbme->getUpdateTimestamp()); const int res = tbme->read(0, data_, SIZE); if (res < 0) { @@ -215,7 +201,6 @@ public: virtual TransferBufferBase* access(uint8_t node_id) = 0; virtual TransferBufferBase* create(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)) { assert(!dyn->isEmpty()); - assert(dyn->getUpdateTimestamp() == sb->getUpdateTimestamp()); UAVCAN_TRACE("TransferBufferManager", "Storage optimization: Migrated NID %i", int(dyn->getNodeID())); dynamic_buffers_.remove(dyn); DynamicTransferBuffer::destroy(dyn, allocator_); @@ -293,7 +277,14 @@ public: ~TransferBufferManager() { - cleanup(std::numeric_limits::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(); } @@ -368,40 +359,6 @@ public: 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(); - } }; } diff --git a/libuavcan/test/transport/transfer_buffer.cpp b/libuavcan/test/transport/transfer_buffer.cpp index 1e37bb16eb..fd9b5b0450 100644 --- a/libuavcan/test/transport/transfer_buffer.cpp +++ b/libuavcan/test/transport/transfer_buffer.cpp @@ -250,13 +250,11 @@ TEST(TransferBufferManager, Basic) // Static 0 ASSERT_TRUE((tbb = mgr->create(0))); - tbb->setUpdateTimestamp(1234); ASSERT_EQ(MGR_STATIC_BUFFER_SIZE, fillTestData(MGR_TEST_DATA[0], tbb)); ASSERT_EQ(1, mgr->getNumStaticBuffers()); // Static 1 ASSERT_TRUE((tbb = mgr->create(1))); - tbb->setUpdateTimestamp(2345); ASSERT_EQ(MGR_STATIC_BUFFER_SIZE, fillTestData(MGR_TEST_DATA[1], tbb)); ASSERT_EQ(2, mgr->getNumStaticBuffers()); ASSERT_EQ(0, mgr->getNumDynamicBuffers()); @@ -265,7 +263,6 @@ TEST(TransferBufferManager, Basic) // Dynamic 0 ASSERT_TRUE((tbb = mgr->create(2))); 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(2, mgr->getNumStaticBuffers()); ASSERT_EQ(1, mgr->getNumDynamicBuffers()); @@ -276,7 +273,6 @@ TEST(TransferBufferManager, Basic) // Dynamic 2 ASSERT_TRUE((tbb = mgr->create(127))); 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(2, mgr->getNumStaticBuffers()); @@ -289,19 +285,15 @@ TEST(TransferBufferManager, Basic) // Making sure all buffers contain proper data ASSERT_TRUE((tbb = mgr->access(0))); - ASSERT_EQ(1234, tbb->getUpdateTimestamp()); ASSERT_TRUE(matchAgainst(MGR_TEST_DATA[0], *tbb)); ASSERT_TRUE((tbb = mgr->access(1))); - ASSERT_EQ(2345, tbb->getUpdateTimestamp()); ASSERT_TRUE(matchAgainst(MGR_TEST_DATA[1], *tbb)); ASSERT_TRUE((tbb = mgr->access(2))); - ASSERT_EQ(3456, tbb->getUpdateTimestamp()); ASSERT_TRUE(matchAgainst(MGR_TEST_DATA[2], *tbb)); ASSERT_TRUE((tbb = mgr->access(127))); - ASSERT_EQ(4567, tbb->getUpdateTimestamp()); ASSERT_TRUE(matchAgainst(MGR_TEST_DATA[3], *tbb)); // 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_LT(0, pool.getNumFreeBlocks()); - // Cleanup must remove NodeID 0 due to low timestamp; migration should fail due to oversized data - mgr->cleanup(2000); + // Removing NodeID 0; migration should fail due to oversized data + mgr->remove(0); ASSERT_FALSE(mgr->access(0)); ASSERT_EQ(1, mgr->getNumStaticBuffers()); ASSERT_EQ(1, mgr->getNumDynamicBuffers()); // Migration failed // At this time we have the following NodeID: 2, 127 ASSERT_TRUE((tbb = mgr->access(2))); - ASSERT_EQ(3456, tbb->getUpdateTimestamp()); ASSERT_TRUE(matchAgainst(MGR_TEST_DATA[2], *tbb)); ASSERT_TRUE((tbb = mgr->access(127))); - ASSERT_EQ(4567, tbb->getUpdateTimestamp()); ASSERT_TRUE(matchAgainst(MGR_TEST_DATA[3], *tbb)); // These were deleted: 0, 1