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