From 031f90f3265b55ce9b8733182a583b129dfb722f Mon Sep 17 00:00:00 2001 From: Pavel Kirienko Date: Tue, 11 Feb 2014 20:13:19 +0400 Subject: [PATCH] Added TransferBufferAccessor, saves few bytes on stack/heap --- .../internal/transport/transfer_buffer.hpp | 21 ++++++++++++++++++ .../internal/transport/transfer_receiver.hpp | 18 ++------------- libuavcan/src/transport/transfer_receiver.cpp | 22 +++++++------------ .../test/transport/transfer_receiver.cpp | 15 ++++++------- 4 files changed, 38 insertions(+), 38 deletions(-) diff --git a/libuavcan/include/uavcan/internal/transport/transfer_buffer.hpp b/libuavcan/include/uavcan/internal/transport/transfer_buffer.hpp index d5a6c64cd3..193602e737 100644 --- a/libuavcan/include/uavcan/internal/transport/transfer_buffer.hpp +++ b/libuavcan/include/uavcan/internal/transport/transfer_buffer.hpp @@ -242,6 +242,27 @@ public: virtual void remove(const TransferBufferManagerKey& key) = 0; }; +/** + * Convinience class. + */ +class TransferBufferAccessor +{ + ITransferBufferManager* const bufmgr_; + const TransferBufferManagerKey key_; + +public: + TransferBufferAccessor(ITransferBufferManager* bufmgr, TransferBufferManagerKey key) + : bufmgr_(bufmgr) + , key_(key) + { + assert(bufmgr); + assert(!key.isEmpty()); + } + TransferBufferBase* access() { return bufmgr_->access(key_); } + TransferBufferBase* create() { return bufmgr_->create(key_); } + void remove() { bufmgr_->remove(key_); } +}; + /** * Buffer manager implementation. */ diff --git a/libuavcan/include/uavcan/internal/transport/transfer_receiver.hpp b/libuavcan/include/uavcan/internal/transport/transfer_receiver.hpp index 5861fad125..726e7f1c67 100644 --- a/libuavcan/include/uavcan/internal/transport/transfer_receiver.hpp +++ b/libuavcan/include/uavcan/internal/transport/transfer_receiver.hpp @@ -29,7 +29,6 @@ private: uint64_t this_transfer_ts_monotonic_; uint64_t first_frame_ts_utc_; uint32_t transfer_interval_; - ITransferBufferManager* bufmgr_; TransferID tid_; uint8_t iface_index_; uint8_t next_frame_index_; @@ -42,7 +41,7 @@ private: void prepareForNextTransfer(); bool validate(const RxFrame& frame) const; - ResultCode receive(const RxFrame& frame, const TransferBufferManagerKey& bufmgr_key); + ResultCode receive(const RxFrame& frame, TransferBufferAccessor& tba); TransferReceiver(const TransferReceiver&); // = delete (not needed) @@ -52,26 +51,13 @@ public: , this_transfer_ts_monotonic_(0) , first_frame_ts_utc_(0) , transfer_interval_(DEFAULT_TRANSFER_INTERVAL) - , bufmgr_(NULL) , iface_index_(IFACE_INDEX_NOTSET) , next_frame_index_(0) { } - TransferReceiver(ITransferBufferManager* bufmgr) - : prev_transfer_ts_monotonic_(0) - , this_transfer_ts_monotonic_(0) - , first_frame_ts_utc_(0) - , transfer_interval_(DEFAULT_TRANSFER_INTERVAL) - , bufmgr_(bufmgr) - , iface_index_(IFACE_INDEX_NOTSET) - , next_frame_index_(0) - { - assert(bufmgr); - } - bool isTimedOut(uint64_t ts_monotonic) const; - ResultCode addFrame(const RxFrame& frame, const TransferBufferManagerKey& bufmgr_key); + ResultCode addFrame(const RxFrame& frame, TransferBufferAccessor& tba); uint64_t getLastTransferTimestampMonotonic() const { return prev_transfer_ts_monotonic_; } uint64_t getLastTransferTimestampUtc() const { return first_frame_ts_utc_; } diff --git a/libuavcan/src/transport/transfer_receiver.cpp b/libuavcan/src/transport/transfer_receiver.cpp index cf75487c64..0d22141c37 100644 --- a/libuavcan/src/transport/transfer_receiver.cpp +++ b/libuavcan/src/transport/transfer_receiver.cpp @@ -86,8 +86,7 @@ bool TransferReceiver::validate(const RxFrame& frame) const return true; } -TransferReceiver::ResultCode TransferReceiver::receive(const RxFrame& frame, - const TransferBufferManagerKey& bufmgr_key) +TransferReceiver::ResultCode TransferReceiver::receive(const RxFrame& frame, TransferBufferAccessor& tba) { if (frame.frame_index == 0) { @@ -97,15 +96,15 @@ TransferReceiver::ResultCode TransferReceiver::receive(const RxFrame& frame, if ((frame.frame_index == 0) && frame.last_frame) // Single-frame transfer { - bufmgr_->remove(bufmgr_key); + tba.remove(); updateTransferTimings(); prepareForNextTransfer(); return RESULT_SINGLE_FRAME; } - TransferBufferBase* buf = bufmgr_->access(bufmgr_key); + TransferBufferBase* buf = tba.access(); if (buf == NULL) - buf = bufmgr_->create(bufmgr_key); + buf = tba.create(); if (buf == NULL) { UAVCAN_TRACE("TransferReceiver", "Failed to access the buffer, %s", frame.toString().c_str()); @@ -117,7 +116,7 @@ TransferReceiver::ResultCode TransferReceiver::receive(const RxFrame& frame, if (res != frame.payload_len) { UAVCAN_TRACE("TransferReceiver", "Buffer write failure [%i], %s", res, frame.toString().c_str()); - bufmgr_->remove(bufmgr_key); + tba.remove(); prepareForNextTransfer(); return RESULT_NOT_COMPLETE; } @@ -141,13 +140,8 @@ bool TransferReceiver::isTimedOut(uint64_t ts_monotonic) const return (ts_monotonic - ts) > (uint64_t(transfer_interval_) * INTERVAL_MULT); } -TransferReceiver::ResultCode TransferReceiver::addFrame(const RxFrame& frame, - const TransferBufferManagerKey& bufmgr_key) +TransferReceiver::ResultCode TransferReceiver::addFrame(const RxFrame& frame, TransferBufferAccessor& tba) { - assert(bufmgr_); - assert(bufmgr_key.getNodeID() == frame.source_node_id); - assert(bufmgr_key.getTransferType() == frame.transfer_type); - if ((frame.ts_monotonic == 0) || (frame.ts_monotonic < prev_transfer_ts_monotonic_) || (frame.ts_monotonic < this_transfer_ts_monotonic_)) @@ -174,7 +168,7 @@ TransferReceiver::ResultCode TransferReceiver::addFrame(const RxFrame& frame, "Restart [not_inited=%i, iface_timeout=%i, recv_timeout=%i, same_iface=%i, first_frame=%i, tid_rel=%i], %s", int(not_initialized), int(iface_timed_out), int(receiver_timed_out), int(same_iface), int(first_fame), int(tid_rel), frame.toString().c_str()); - bufmgr_->remove(bufmgr_key); + tba.remove(); iface_index_ = frame.iface_index; tid_ = frame.transfer_id; next_frame_index_ = 0; @@ -188,7 +182,7 @@ TransferReceiver::ResultCode TransferReceiver::addFrame(const RxFrame& frame, if (!validate(frame)) return RESULT_NOT_COMPLETE; - return receive(frame, bufmgr_key); + return receive(frame, tba); } } diff --git a/libuavcan/test/transport/transfer_receiver.cpp b/libuavcan/test/transport/transfer_receiver.cpp index 36ce00cf0f..56ba9a7100 100644 --- a/libuavcan/test/transport/transfer_receiver.cpp +++ b/libuavcan/test/transport/transfer_receiver.cpp @@ -62,7 +62,6 @@ struct Context : bufmgr(&poolmgr) { assert(poolmgr.allocate(1) == NULL); - receiver = uavcan::TransferReceiver(&bufmgr); } ~Context() @@ -101,10 +100,10 @@ TEST(TransferReceiver, Basic) { using uavcan::TransferReceiver; Context<32> context; - const uavcan::TransferBufferManagerKey bk = RxFrameGenerator::DEFAULT_KEY; RxFrameGenerator gen(789, uavcan::TRANSFER_TYPE_MESSAGE_BROADCAST); uavcan::TransferReceiver& rcv = context.receiver; uavcan::ITransferBufferManager& bufmgr = context.bufmgr; + uavcan::TransferBufferAccessor bk(&context.bufmgr, RxFrameGenerator::DEFAULT_KEY); /* * Empty @@ -218,10 +217,10 @@ TEST(TransferReceiver, Basic) TEST(TransferReceiver, OutOfBufferSpace_32bytes) { Context<32> context; - const uavcan::TransferBufferManagerKey bk = RxFrameGenerator::DEFAULT_KEY; RxFrameGenerator gen(789, uavcan::TRANSFER_TYPE_MESSAGE_BROADCAST); uavcan::TransferReceiver& rcv = context.receiver; uavcan::ITransferBufferManager& bufmgr = context.bufmgr; + uavcan::TransferBufferAccessor bk(&context.bufmgr, RxFrameGenerator::DEFAULT_KEY); /* * Simple transfer, maximum buffer length @@ -252,10 +251,10 @@ TEST(TransferReceiver, OutOfBufferSpace_32bytes) TEST(TransferReceiver, UnterminatedTransfer) { Context<256> context; - const uavcan::TransferBufferManagerKey bk = RxFrameGenerator::DEFAULT_KEY; RxFrameGenerator gen(789, uavcan::TRANSFER_TYPE_MESSAGE_BROADCAST); uavcan::TransferReceiver& rcv = context.receiver; uavcan::ITransferBufferManager& bufmgr = context.bufmgr; + uavcan::TransferBufferAccessor bk(&context.bufmgr, RxFrameGenerator::DEFAULT_KEY); std::string content; for (int i = 0; i <= uavcan::Frame::FRAME_INDEX_MAX; i++) @@ -272,10 +271,10 @@ TEST(TransferReceiver, UnterminatedTransfer) TEST(TransferReceiver, OutOfOrderFrames) { Context<32> context; - const uavcan::TransferBufferManagerKey bk = RxFrameGenerator::DEFAULT_KEY; RxFrameGenerator gen(789, uavcan::TRANSFER_TYPE_MESSAGE_BROADCAST); uavcan::TransferReceiver& rcv = context.receiver; uavcan::ITransferBufferManager& bufmgr = context.bufmgr; + uavcan::TransferBufferAccessor bk(&context.bufmgr, RxFrameGenerator::DEFAULT_KEY); CHECK_NOT_COMPLETE(rcv.addFrame(gen(1, "12345678", 0, false, 10, 100000000), bk)); CHECK_NOT_COMPLETE(rcv.addFrame(gen(1, "--------", 3, false, 10, 100000100), bk)); // Out of order @@ -292,10 +291,10 @@ TEST(TransferReceiver, OutOfOrderFrames) TEST(TransferReceiver, IntervalMeasurement) { Context<32> context; - const uavcan::TransferBufferManagerKey bk = RxFrameGenerator::DEFAULT_KEY; RxFrameGenerator gen(789, uavcan::TRANSFER_TYPE_MESSAGE_BROADCAST); uavcan::TransferReceiver& rcv = context.receiver; uavcan::ITransferBufferManager& bufmgr = context.bufmgr; + uavcan::TransferBufferAccessor bk(&context.bufmgr, RxFrameGenerator::DEFAULT_KEY); static const int INTERVAL = 1000; uavcan::TransferID tid; @@ -321,10 +320,10 @@ TEST(TransferReceiver, IntervalMeasurement) TEST(TransferReceiver, Restart) { Context<32> context; - const uavcan::TransferBufferManagerKey bk = RxFrameGenerator::DEFAULT_KEY; RxFrameGenerator gen(789, uavcan::TRANSFER_TYPE_MESSAGE_BROADCAST); uavcan::TransferReceiver& rcv = context.receiver; uavcan::ITransferBufferManager& bufmgr = context.bufmgr; + uavcan::TransferBufferAccessor bk(&context.bufmgr, RxFrameGenerator::DEFAULT_KEY); /* * This transfer looks complete, but must be ignored because of large delay after the first frame @@ -361,10 +360,10 @@ TEST(TransferReceiver, Restart) TEST(TransferReceiver, UtcTransferTimestamping) { Context<32> context; - const uavcan::TransferBufferManagerKey bk = RxFrameGenerator::DEFAULT_KEY; RxFrameGenerator gen(789, uavcan::TRANSFER_TYPE_MESSAGE_BROADCAST); uavcan::TransferReceiver& rcv = context.receiver; uavcan::ITransferBufferManager& bufmgr = context.bufmgr; + uavcan::TransferBufferAccessor bk(&context.bufmgr, RxFrameGenerator::DEFAULT_KEY); /* * Zero UTC timestamp must be preserved