From 05099181e5bde0299df28a2622be0775b7d1fb11 Mon Sep 17 00:00:00 2001 From: Pavel Kirienko Date: Sun, 31 May 2015 07:18:56 +0300 Subject: [PATCH] Marshal buffer removed --- .../include/uavcan/node/abstract_node.hpp | 2 - .../include/uavcan/node/generic_publisher.hpp | 33 ++++--- .../include/uavcan/node/marshal_buffer.hpp | 90 ------------------- libuavcan/include/uavcan/node/node.hpp | 25 ++---- libuavcan/src/node/uc_generic_publisher.cpp | 13 +-- libuavcan/test/node/test_node.hpp | 2 - 6 files changed, 30 insertions(+), 135 deletions(-) delete mode 100644 libuavcan/include/uavcan/node/marshal_buffer.hpp diff --git a/libuavcan/include/uavcan/node/abstract_node.hpp b/libuavcan/include/uavcan/node/abstract_node.hpp index 7fddbe32b6..026cb65c57 100644 --- a/libuavcan/include/uavcan/node/abstract_node.hpp +++ b/libuavcan/include/uavcan/node/abstract_node.hpp @@ -7,7 +7,6 @@ #include #include -#include namespace uavcan { @@ -23,7 +22,6 @@ public: virtual IPoolAllocator& getAllocator() = 0; virtual Scheduler& getScheduler() = 0; virtual const Scheduler& getScheduler() const = 0; - virtual IMarshalBufferProvider& getMarshalBufferProvider() = 0; virtual void registerInternalFailure(const char* msg) = 0; Dispatcher& getDispatcher() { return getScheduler().getDispatcher(); } diff --git a/libuavcan/include/uavcan/node/generic_publisher.hpp b/libuavcan/include/uavcan/node/generic_publisher.hpp index 7991cc5044..d1c04e56e0 100644 --- a/libuavcan/include/uavcan/node/generic_publisher.hpp +++ b/libuavcan/include/uavcan/node/generic_publisher.hpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -44,10 +45,8 @@ protected: MonotonicTime getTxDeadline() const; - IMarshalBuffer* getBuffer(unsigned byte_len); - - int genericPublish(const IMarshalBuffer& buffer, TransferType transfer_type, NodeID dst_node_id, - TransferID* tid, MonotonicTime blocking_deadline); + int genericPublish(const StaticTransferBufferImpl& buffer, TransferType transfer_type, + NodeID dst_node_id, TransferID* tid, MonotonicTime blocking_deadline); TransferSender& getTransferSender() { return sender_; } const TransferSender& getTransferSender() const { return sender_; } @@ -79,6 +78,15 @@ public: template class UAVCAN_EXPORT GenericPublisher : public GenericPublisherBase { + struct ZeroTransferBuffer : public StaticTransferBufferImpl + { + ZeroTransferBuffer() : StaticTransferBufferImpl(NULL, 0) { } + }; + + typedef typename Select::Result> >::Result Buffer; + enum { Qos = (DataTypeKind(DataSpec::DataTypeKind) == DataTypeKindMessage) ? @@ -87,7 +95,7 @@ class UAVCAN_EXPORT GenericPublisher : public GenericPublisherBase int checkInit(); - int doEncode(const DataStruct& message, IMarshalBuffer& buffer) const; + int doEncode(const DataStruct& message, ITransferBuffer& buffer) const; int genericPublish(const DataStruct& message, TransferType transfer_type, NodeID dst_node_id, TransferID* tid, MonotonicTime blocking_deadline); @@ -138,7 +146,7 @@ int GenericPublisher::checkInit() } template -int GenericPublisher::doEncode(const DataStruct& message, IMarshalBuffer& buffer) const +int GenericPublisher::doEncode(const DataStruct& message, ITransferBuffer& buffer) const { BitStream bitstream(buffer); ScalarCodec codec(bitstream); @@ -161,17 +169,16 @@ int GenericPublisher::genericPublish(const DataStruct& mes { return res; } - IMarshalBuffer* const buf = getBuffer(BitLenToByteLen::Result); - if (!buf) - { - return -ErrMemory; - } - const int encode_res = doEncode(message, *buf); + + Buffer buffer; + + const int encode_res = doEncode(message, buffer); if (encode_res < 0) { return encode_res; } - return GenericPublisherBase::genericPublish(*buf, transfer_type, dst_node_id, tid, blocking_deadline); + + return GenericPublisherBase::genericPublish(buffer, transfer_type, dst_node_id, tid, blocking_deadline); } } diff --git a/libuavcan/include/uavcan/node/marshal_buffer.hpp b/libuavcan/include/uavcan/node/marshal_buffer.hpp deleted file mode 100644 index 353233bc33..0000000000 --- a/libuavcan/include/uavcan/node/marshal_buffer.hpp +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (C) 2014 Pavel Kirienko - */ - -#ifndef UAVCAN_NODE_MARSHAL_BUFFER_HPP_INCLUDED -#define UAVCAN_NODE_MARSHAL_BUFFER_HPP_INCLUDED - -#include -#include -#include - -namespace uavcan -{ -/** - * Abstract temporary buffer for data marshalling. - */ -class UAVCAN_EXPORT IMarshalBuffer : public ITransferBuffer -{ -public: - virtual const uint8_t* getDataPtr() const = 0; - virtual unsigned getMaxWritePos() const = 0; -}; - -/** - * Abstract provider of abstract buffer for data marshalling. - */ -class UAVCAN_EXPORT IMarshalBufferProvider -{ -public: - virtual ~IMarshalBufferProvider() { } - - /** - * Returns pointer to abstract buffer for data marshalling, - * but does not transfer ownership. - * If the requested buffer size is larger than available, - * null pointer will be returned. - * @param size Maximum buffer size needed for marshaling. - * @return Pointer to the buffer, or null pointer if - * the requested size is too large. - */ - virtual IMarshalBuffer* getBuffer(unsigned size) = 0; -}; - -/** - * Default implementation of marshal buffer provider. - */ -template -class UAVCAN_EXPORT MarshalBufferProvider : public IMarshalBufferProvider -{ - class Buffer : public IMarshalBuffer - { - StaticTransferBuffer buf_; - - virtual int read(unsigned offset, uint8_t* data, unsigned len) const - { - return buf_.read(offset, data, len); - } - - virtual int write(unsigned offset, const uint8_t* data, unsigned len) - { - return buf_.write(offset, data, len); - } - - virtual const uint8_t* getDataPtr() const { return buf_.getRawPtr(); } - - virtual unsigned getMaxWritePos() const { return buf_.getMaxWritePos(); } - - public: - void reset() { buf_.reset(); } - }; - - Buffer buffer_; - -public: - enum { MaxSize = MaxSize_ }; - - virtual IMarshalBuffer* getBuffer(unsigned size) - { - if (size > MaxSize) - { - return NULL; - } - buffer_.reset(); - return &buffer_; - } -}; - -} - -#endif // UAVCAN_NODE_MARSHAL_BUFFER_HPP_INCLUDED diff --git a/libuavcan/include/uavcan/node/node.hpp b/libuavcan/include/uavcan/node/node.hpp index 9cc2773c5c..fc8b43e9f9 100644 --- a/libuavcan/include/uavcan/node/node.hpp +++ b/libuavcan/include/uavcan/node/node.hpp @@ -10,7 +10,6 @@ #include #include #include -#include // High-level functionality available by default #include @@ -46,21 +45,12 @@ namespace uavcan * Additional objects for Transfer ID tracking will * be allocated in the memory pool if needed. * Default value is acceptable for any use case. - * - * @tparam MarshalBufferSize Size of the marshal buffer that is used to provide short-term temporary storage for - * serialized data for TX transfers. The buffer must be large enough to accommodate - * largest serialized TX transfer. The default value is guaranteed to be large enough, - * but it can be reduced if long TX transfers are not used to optimize memory use. - * If UAVCAN_TINY mode is enabled, this value defaults to the maximum length of a - * response transfer of uavcan.protocol.GetNodeInfo. */ template ::Result + unsigned OutgoingTransferRegistryStaticEntries = 0 #else - unsigned OutgoingTransferRegistryStaticEntries = 10, - unsigned MarshalBufferSize = MaxPossibleTransferPayloadLen + unsigned OutgoingTransferRegistryStaticEntries = 10 #endif > class UAVCAN_EXPORT Node : public INode @@ -73,7 +63,6 @@ class UAVCAN_EXPORT Node : public INode typedef PoolAllocator Allocator; Allocator pool_allocator_; - MarshalBufferProvider marsh_buf_; OutgoingTransferRegistry outgoing_trans_reg_; Scheduler scheduler_; @@ -100,8 +89,6 @@ protected: #endif } - virtual IMarshalBufferProvider& getMarshalBufferProvider() { return marsh_buf_; } - public: Node(ICanDriver& can_driver, ISystemClock& system_clock) : outgoing_trans_reg_(pool_allocator_) @@ -265,8 +252,8 @@ public: // ---------------------------------------------------------------------------- -template -int Node::start( +template +int Node::start( const TransferPriority priority) { if (started_) @@ -312,8 +299,8 @@ fail: #if !UAVCAN_TINY -template -int Node:: +template +int Node:: checkNetworkCompatibility(NetworkCompatibilityCheckResult& result) { if (!started_) diff --git a/libuavcan/src/node/uc_generic_publisher.cpp b/libuavcan/src/node/uc_generic_publisher.cpp index 73ab834d96..28e9b36acd 100644 --- a/libuavcan/src/node/uc_generic_publisher.cpp +++ b/libuavcan/src/node/uc_generic_publisher.cpp @@ -38,22 +38,17 @@ MonotonicTime GenericPublisherBase::getTxDeadline() const return node_.getMonotonicTime() + tx_timeout_; } -IMarshalBuffer* GenericPublisherBase::getBuffer(unsigned byte_len) -{ - return node_.getMarshalBufferProvider().getBuffer(byte_len); -} - -int GenericPublisherBase::genericPublish(const IMarshalBuffer& buffer, TransferType transfer_type, NodeID dst_node_id, - TransferID* tid, MonotonicTime blocking_deadline) +int GenericPublisherBase::genericPublish(const StaticTransferBufferImpl& buffer, TransferType transfer_type, + NodeID dst_node_id, TransferID* tid, MonotonicTime blocking_deadline) { if (tid) { - return sender_.send(buffer.getDataPtr(), buffer.getMaxWritePos(), getTxDeadline(), + return sender_.send(buffer.getRawPtr(), buffer.getMaxWritePos(), getTxDeadline(), blocking_deadline, transfer_type, dst_node_id, *tid); } else { - return sender_.send(buffer.getDataPtr(), buffer.getMaxWritePos(), getTxDeadline(), + return sender_.send(buffer.getRawPtr(), buffer.getMaxWritePos(), getTxDeadline(), blocking_deadline, transfer_type, dst_node_id); } } diff --git a/libuavcan/test/node/test_node.hpp b/libuavcan/test/node/test_node.hpp index 5a943ae6da..f101f00991 100644 --- a/libuavcan/test/node/test_node.hpp +++ b/libuavcan/test/node/test_node.hpp @@ -20,7 +20,6 @@ struct TestNode : public uavcan::INode { uavcan::PoolAllocator pool; uavcan::PoolManager<1> poolmgr; - uavcan::MarshalBufferProvider<512> buffer_provider; uavcan::OutgoingTransferRegistry<8> otr; uavcan::Scheduler scheduler; uint64_t internal_failure_count; @@ -43,7 +42,6 @@ struct TestNode : public uavcan::INode virtual uavcan::PoolManager<1>& getAllocator() { return poolmgr; } virtual uavcan::Scheduler& getScheduler() { return scheduler; } virtual const uavcan::Scheduler& getScheduler() const { return scheduler; } - virtual uavcan::IMarshalBufferProvider& getMarshalBufferProvider() { return buffer_provider; } };