diff --git a/libuavcan/include/uavcan/transport/transfer_buffer.hpp b/libuavcan/include/uavcan/transport/transfer_buffer.hpp index 723b2e9540..fa7711e087 100644 --- a/libuavcan/include/uavcan/transport/transfer_buffer.hpp +++ b/libuavcan/include/uavcan/transport/transfer_buffer.hpp @@ -121,6 +121,9 @@ class UAVCAN_EXPORT DynamicTransferBufferManagerEntry uint16_t max_write_pos_; const uint16_t max_size_; + /// Reset functionality must be implemented in a non-virtual method to call it safely from the destructor. + void doReset(); + void resetImpl(); public: @@ -136,7 +139,7 @@ public: ~DynamicTransferBufferManagerEntry() { - DynamicTransferBufferManagerEntry::resetImpl(); + doReset(); } static DynamicTransferBufferManagerEntry* instantiate(IPoolAllocator& allocator, uint16_t max_size); diff --git a/libuavcan/src/transport/uc_transfer_buffer.cpp b/libuavcan/src/transport/uc_transfer_buffer.cpp index 4474d58f93..4aad17ff9c 100644 --- a/libuavcan/src/transport/uc_transfer_buffer.cpp +++ b/libuavcan/src/transport/uc_transfer_buffer.cpp @@ -96,7 +96,7 @@ void DynamicTransferBufferManagerEntry::destroy(DynamicTransferBufferManagerEntr } } -void DynamicTransferBufferManagerEntry::resetImpl() +void DynamicTransferBufferManagerEntry::doReset() { max_write_pos_ = 0; Block* p = blocks_.get(); @@ -109,6 +109,11 @@ void DynamicTransferBufferManagerEntry::resetImpl() } } +void DynamicTransferBufferManagerEntry::resetImpl() +{ + doReset(); +} + int DynamicTransferBufferManagerEntry::read(unsigned offset, uint8_t* data, unsigned len) const { if (!data)