15 #ifndef RCLCPP__MESSAGE_MEMORY_STRATEGY_HPP_
16 #define RCLCPP__MESSAGE_MEMORY_STRATEGY_HPP_
23 #include "rclcpp/allocator/allocator_common.hpp"
24 #include "rclcpp/exceptions.hpp"
25 #include "rclcpp/macros.hpp"
26 #include "rclcpp/serialized_message.hpp"
27 #include "rclcpp/visibility_control.hpp"
29 #include "rcutils/logging_macros.h"
31 #include "rmw/serialized_message.h"
35 namespace message_memory_strategy
40 template<
typename MessageT,
typename Alloc = std::allocator<
void>>
46 using MessageAllocTraits = allocator::AllocRebind<MessageT, Alloc>;
47 using MessageAlloc =
typename MessageAllocTraits::allocator_type;
48 using MessageDeleter = allocator::Deleter<MessageAlloc, MessageT>;
50 using SerializedMessageAllocTraits = allocator::AllocRebind<rclcpp::SerializedMessage, Alloc>;
51 using SerializedMessageAlloc =
typename SerializedMessageAllocTraits::allocator_type;
52 using SerializedMessageDeleter =
53 allocator::Deleter<SerializedMessageAlloc, rclcpp::SerializedMessage>;
55 using BufferAllocTraits = allocator::AllocRebind<char, Alloc>;
56 using BufferAlloc =
typename BufferAllocTraits::allocator_type;
57 using BufferDeleter = allocator::Deleter<BufferAlloc, char>;
61 message_allocator_ = std::make_shared<MessageAlloc>();
62 serialized_message_allocator_ = std::make_shared<SerializedMessageAlloc>();
63 buffer_allocator_ = std::make_shared<BufferAlloc>();
64 rcutils_allocator_ = allocator::get_rcl_allocator<char, BufferAlloc>(*buffer_allocator_.get());
69 message_allocator_ = std::make_shared<MessageAlloc>(*allocator.get());
70 serialized_message_allocator_ = std::make_shared<SerializedMessageAlloc>(*allocator.get());
71 buffer_allocator_ = std::make_shared<BufferAlloc>(*allocator.get());
72 rcutils_allocator_ = allocator::get_rcl_allocator<char, BufferAlloc>(*buffer_allocator_.get());
80 return std::make_shared<MessageMemoryStrategy<MessageT, Alloc>>(std::make_shared<Alloc>());
87 return std::allocate_shared<MessageT, MessageAlloc>(*message_allocator_.get());
90 virtual std::shared_ptr<rclcpp::SerializedMessage> borrow_serialized_message(
size_t capacity)
92 return std::make_shared<rclcpp::SerializedMessage>(capacity);
95 virtual std::shared_ptr<rclcpp::SerializedMessage> borrow_serialized_message()
97 return borrow_serialized_message(default_buffer_capacity_);
100 virtual void set_default_buffer_capacity(
size_t capacity)
102 default_buffer_capacity_ = capacity;
112 virtual void return_serialized_message(
113 std::shared_ptr<rclcpp::SerializedMessage> & serialized_msg)
115 serialized_msg.reset();
118 std::shared_ptr<MessageAlloc> message_allocator_;
119 MessageDeleter message_deleter_;
121 std::shared_ptr<SerializedMessageAlloc> serialized_message_allocator_;
122 SerializedMessageDeleter serialized_message_deleter_;
124 std::shared_ptr<BufferAlloc> buffer_allocator_;
125 BufferDeleter buffer_deleter_;
126 size_t default_buffer_capacity_ = 0;
128 rcutils_allocator_t rcutils_allocator_;
Default allocation strategy for messages received by subscriptions.
static SharedPtr create_default()
Default factory method.
virtual void return_message(std::shared_ptr< MessageT > &msg)
Release ownership of the message, which will deallocate it if it has no more owners.
virtual std::shared_ptr< MessageT > borrow_message()
By default, dynamically allocate a new message.
Versions of rosidl_typesupport_cpp::get_message_type_support_handle that handle adapted types.
@ SharedPtr
Set the data type used in the intra-process buffer as std::shared_ptr<MessageT>