From e9680c04d01b3a8435714cb934e045b505bbb395 Mon Sep 17 00:00:00 2001 From: Pavel Kirienko Date: Mon, 10 Feb 2014 18:46:26 +0400 Subject: [PATCH] TransferReceiver - fixed assignment operator --- .../internal/transport/transfer_receiver.hpp | 20 ++++++++++++++++--- libuavcan/src/transport/transfer_receiver.cpp | 6 ++++++ .../test/transport/transfer_receiver.cpp | 8 ++++++++ 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/libuavcan/include/uavcan/internal/transport/transfer_receiver.hpp b/libuavcan/include/uavcan/internal/transport/transfer_receiver.hpp index 91448134c1..549baaed6f 100644 --- a/libuavcan/include/uavcan/internal/transport/transfer_receiver.hpp +++ b/libuavcan/include/uavcan/internal/transport/transfer_receiver.hpp @@ -34,6 +34,8 @@ private: bool isInitialized() const { return iface_index_ != IFACE_INDEX_NOTSET; } + void cleanup(); + TidRelation getTidRelation(const RxFrame& frame) const; void updateTransferTimings(); @@ -42,6 +44,8 @@ private: bool validate(const RxFrame& frame) const; ResultCode receive(const RxFrame& frame); + TransferReceiver(const TransferReceiver&); // = delete (not needed) + public: TransferReceiver() : prev_transfer_timestamp_(0) @@ -68,10 +72,20 @@ public: assert(node_id != NODE_ID_BROADCAST); } - ~TransferReceiver() + ~TransferReceiver() { cleanup(); } + + TransferReceiver& operator=(const TransferReceiver& rhs) { - if (bufmgr_ != NULL && node_id_ != NODE_ID_INVALID) - bufmgr_->remove(node_id_); + cleanup(); + prev_transfer_timestamp_ = rhs.prev_transfer_timestamp_; + this_transfer_timestamp_ = rhs.this_transfer_timestamp_; + transfer_interval_ = rhs.transfer_interval_; + bufmgr_ = rhs.bufmgr_; + tid_ = rhs.tid_; + node_id_ = rhs.node_id_; + iface_index_ = rhs.iface_index_; + next_frame_index_ = rhs.next_frame_index_; + return *this; } bool isTimedOut(uint64_t timestamp) const; diff --git a/libuavcan/src/transport/transfer_receiver.cpp b/libuavcan/src/transport/transfer_receiver.cpp index 61dec465c0..2e6245cc6c 100644 --- a/libuavcan/src/transport/transfer_receiver.cpp +++ b/libuavcan/src/transport/transfer_receiver.cpp @@ -16,6 +16,12 @@ const uint64_t TransferReceiver::DEFAULT_TRANSFER_INTERVAL; const uint64_t TransferReceiver::MIN_TRANSFER_INTERVAL; const uint64_t TransferReceiver::MAX_TRANSFER_INTERVAL; +void TransferReceiver::cleanup() +{ + if (bufmgr_ != NULL && node_id_ != NODE_ID_INVALID) + bufmgr_->remove(node_id_); +} + TransferReceiver::TidRelation TransferReceiver::getTidRelation(const RxFrame& frame) const { const int distance = tid_.forwardDistance(frame.transfer_id); diff --git a/libuavcan/test/transport/transfer_receiver.cpp b/libuavcan/test/transport/transfer_receiver.cpp index 3d96a14921..44761e246d 100644 --- a/libuavcan/test/transport/transfer_receiver.cpp +++ b/libuavcan/test/transport/transfer_receiver.cpp @@ -203,6 +203,14 @@ TEST(TransferReceiver, Basic) ASSERT_LT(TransferReceiver::DEFAULT_TRANSFER_INTERVAL, rcv.getInterval()); ASSERT_LE(TransferReceiver::MIN_TRANSFER_INTERVAL, rcv.getInterval()); ASSERT_GE(TransferReceiver::MAX_TRANSFER_INTERVAL, rcv.getInterval()); + ASSERT_TRUE(matchBufferContent(bufmgr.access(gen.source_node_id), "12345678qwe")); + + /* + * Buffer cleanup + */ + ASSERT_TRUE(bufmgr.access(gen.source_node_id)); + context.receiver = TransferReceiver(); + ASSERT_FALSE(bufmgr.access(gen.source_node_id)); }