15 #ifndef RCLCPP__MESSAGE_MEMORY_STRATEGY_HPP_
16 #define RCLCPP__MESSAGE_MEMORY_STRATEGY_HPP_
24 #include "rclcpp/allocator/allocator_common.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 if constexpr (std::is_same_v<Alloc, std::allocator<void>>) {
67 if constexpr (rclcpp::allocator::has_get_rcl_allocator_v<Alloc>) {
68 rcutils_allocator_ = message_allocator_->get_rcl_allocator();
70 rcutils_allocator_ = allocator::get_rcl_allocator<char,
71 BufferAlloc>(*buffer_allocator_.get());
78 message_allocator_ = std::make_shared<MessageAlloc>(*allocator.get());
79 serialized_message_allocator_ = std::make_shared<SerializedMessageAlloc>(*allocator.get());
80 buffer_allocator_ = std::make_shared<BufferAlloc>(*allocator.get());
81 if constexpr (std::is_same_v<Alloc, std::allocator<void>>) {
84 if constexpr (rclcpp::allocator::has_get_rcl_allocator_v<Alloc>) {
85 rcutils_allocator_ = allocator->get_rcl_allocator();
87 rcutils_allocator_ = allocator::get_rcl_allocator<char,
88 BufferAlloc>(*buffer_allocator_.get());
98 return std::make_shared<MessageMemoryStrategy<MessageT, Alloc>>(std::make_shared<Alloc>());
105 return std::allocate_shared<MessageT, MessageAlloc>(*message_allocator_.get());
108 virtual std::shared_ptr<rclcpp::SerializedMessage> borrow_serialized_message(
size_t capacity)
110 return std::make_shared<rclcpp::SerializedMessage>(capacity);
113 virtual std::shared_ptr<rclcpp::SerializedMessage> borrow_serialized_message()
115 return borrow_serialized_message(default_buffer_capacity_);
118 virtual void set_default_buffer_capacity(
size_t capacity)
120 default_buffer_capacity_ = capacity;
130 virtual void return_serialized_message(
131 std::shared_ptr<rclcpp::SerializedMessage> & serialized_msg)
133 serialized_msg.reset();
136 std::shared_ptr<MessageAlloc> message_allocator_;
137 MessageDeleter message_deleter_;
139 std::shared_ptr<SerializedMessageAlloc> serialized_message_allocator_;
140 SerializedMessageDeleter serialized_message_deleter_;
142 std::shared_ptr<BufferAlloc> buffer_allocator_;
143 BufferDeleter buffer_deleter_;
144 size_t default_buffer_capacity_ = 0;
146 rcutils_allocator_t rcutils_allocator_;
#define rcl_get_default_allocator
Return a properly initialized rcl_allocator_t with default values.
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>