@@ -26,8 +26,14 @@ namespace rclcpp
26
26
27
27
inline void copy_rcl_message (const rcl_serialized_message_t & from, rcl_serialized_message_t & to)
28
28
{
29
- const auto ret = rmw_serialized_message_init (
30
- &to, from.buffer_capacity , &from.allocator );
29
+ auto ret = RCL_RET_ERROR;
30
+ if (nullptr == to.buffer ) {
31
+ ret = rmw_serialized_message_init (&to, from.buffer_capacity , &from.allocator );
32
+ } else {
33
+ ret = rmw_serialized_message_resize (
34
+ &to, from.buffer_capacity );
35
+ }
36
+
31
37
if (RCL_RET_OK != ret) {
32
38
rclcpp::exceptions::throw_from_rcl_error (ret);
33
39
}
@@ -78,7 +84,6 @@ SerializedMessage::SerializedMessage(rcl_serialized_message_t && other)
78
84
SerializedMessage & SerializedMessage::operator =(const SerializedMessage & other)
79
85
{
80
86
if (this != &other) {
81
- serialized_message_ = rmw_get_zero_initialized_serialized_message ();
82
87
copy_rcl_message (other.serialized_message_ , serialized_message_);
83
88
}
84
89
@@ -88,7 +93,6 @@ SerializedMessage & SerializedMessage::operator=(const SerializedMessage & other
88
93
SerializedMessage & SerializedMessage::operator =(const rcl_serialized_message_t & other)
89
94
{
90
95
if (&serialized_message_ != &other) {
91
- serialized_message_ = rmw_get_zero_initialized_serialized_message ();
92
96
copy_rcl_message (other, serialized_message_);
93
97
}
94
98
@@ -98,6 +102,14 @@ SerializedMessage & SerializedMessage::operator=(const rcl_serialized_message_t
98
102
SerializedMessage & SerializedMessage::operator =(SerializedMessage && other)
99
103
{
100
104
if (this != &other) {
105
+ if (nullptr != serialized_message_.buffer ) {
106
+ const auto fini_ret = rmw_serialized_message_fini (&serialized_message_);
107
+ if (RCL_RET_OK != fini_ret) {
108
+ RCLCPP_ERROR (
109
+ get_logger (" rclcpp" ),
110
+ " Failed to destroy serialized message: %s" , rcl_get_error_string ().str );
111
+ }
112
+ }
101
113
serialized_message_ =
102
114
std::exchange (other.serialized_message_ , rmw_get_zero_initialized_serialized_message ());
103
115
}
@@ -108,6 +120,14 @@ SerializedMessage & SerializedMessage::operator=(SerializedMessage && other)
108
120
SerializedMessage & SerializedMessage::operator =(rcl_serialized_message_t && other)
109
121
{
110
122
if (&serialized_message_ != &other) {
123
+ if (nullptr != serialized_message_.buffer ) {
124
+ const auto fini_ret = rmw_serialized_message_fini (&serialized_message_);
125
+ if (RCL_RET_OK != fini_ret) {
126
+ RCLCPP_ERROR (
127
+ get_logger (" rclcpp" ),
128
+ " Failed to destroy serialized message: %s" , rcl_get_error_string ().str );
129
+ }
130
+ }
111
131
serialized_message_ =
112
132
std::exchange (other, rmw_get_zero_initialized_serialized_message ());
113
133
}
0 commit comments