Skip to content

Commit 8447d36

Browse files
committed
Refactor serialization support to use allocators and refs
Signed-off-by: methylDragon <[email protected]>
1 parent 9690672 commit 8447d36

7 files changed

+78
-162
lines changed

rclcpp/include/rclcpp/dynamic_typesupport/dynamic_message_type_support.hpp

+3-4
Original file line numberDiff line numberDiff line change
@@ -37,19 +37,18 @@ namespace rclcpp
3737
namespace dynamic_typesupport
3838
{
3939

40-
/// Utility wrapper class for `rosidl_message_type_support_t *` containing managed
40+
/// Utility wrapper class for `rosidl_message_type_support_t` containing managed
4141
/// instances of the typesupport handle impl.
4242
/**
4343
*
4444
* NOTE: This class is the recommended way to obtain the dynamic message type
45-
* support struct, instead of `rcl_dynamic_message_type_support_handle_create()`,
45+
* support struct, instead of `rcl_dynamic_message_type_support_handle_init()`,
4646
* because this class will manage the lifetimes for you.
4747
*
4848
* Do NOT call rcl_dynamic_message_type_support_handle_fini!!
4949
*
5050
* This class:
51-
* - Manages the lifetime of the raw pointer.
52-
* - Exposes getter methods to get the raw pointer and shared pointers
51+
* - Exposes getter methods for the struct
5352
* - Stores shared pointers to wrapper classes that expose the underlying
5453
* serialization support API
5554
*

rclcpp/include/rclcpp/dynamic_typesupport/dynamic_serialization_support.hpp

+12-20
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
#ifndef RCLCPP__DYNAMIC_TYPESUPPORT__DYNAMIC_SERIALIZATION_SUPPORT_HPP_
1616
#define RCLCPP__DYNAMIC_TYPESUPPORT__DYNAMIC_SERIALIZATION_SUPPORT_HPP_
1717

18+
#include <rcl/allocator.h>
19+
#include <rosidl_dynamic_typesupport/api/serialization_support.h>
1820
#include <rosidl_dynamic_typesupport/types.h>
1921

2022
#include <memory>
@@ -47,21 +49,18 @@ class DynamicSerializationSupport : public std::enable_shared_from_this<DynamicS
4749

4850
// CONSTRUCTION ==================================================================================
4951
RCLCPP_PUBLIC
50-
DynamicSerializationSupport();
52+
explicit DynamicSerializationSupport(rcl_allocator_t allocator = rcl_get_default_allocator());
5153

5254
/// Get the rmw middleware implementation specific serialization support (configured by name)
5355
RCLCPP_PUBLIC
54-
explicit DynamicSerializationSupport(const std::string & serialization_library_name);
56+
DynamicSerializationSupport(
57+
const std::string & serialization_library_name,
58+
rcl_allocator_t allocator = rcl_get_default_allocator());
5559

56-
/// Assume ownership of raw pointer
60+
/// Assume ownership of reference
5761
RCLCPP_PUBLIC
5862
explicit DynamicSerializationSupport(
59-
rosidl_dynamic_typesupport_serialization_support_t * rosidl_serialization_support);
60-
61-
/// Copy shared pointer
62-
RCLCPP_PUBLIC
63-
DynamicSerializationSupport(
64-
std::shared_ptr<rosidl_dynamic_typesupport_serialization_support_t> serialization_support);
63+
rosidl_dynamic_typesupport_serialization_support_t && rosidl_serialization_support);
6564

6665
/// Move constructor
6766
RCLCPP_PUBLIC
@@ -81,25 +80,18 @@ class DynamicSerializationSupport : public std::enable_shared_from_this<DynamicS
8180
get_serialization_library_identifier() const;
8281

8382
RCLCPP_PUBLIC
84-
rosidl_dynamic_typesupport_serialization_support_t *
83+
rosidl_dynamic_typesupport_serialization_support_t &
8584
get_rosidl_serialization_support();
8685

8786
RCLCPP_PUBLIC
88-
const rosidl_dynamic_typesupport_serialization_support_t *
87+
const rosidl_dynamic_typesupport_serialization_support_t &
8988
get_rosidl_serialization_support() const;
9089

91-
RCLCPP_PUBLIC
92-
std::shared_ptr<rosidl_dynamic_typesupport_serialization_support_t>
93-
get_shared_rosidl_serialization_support();
94-
95-
RCLCPP_PUBLIC
96-
std::shared_ptr<const rosidl_dynamic_typesupport_serialization_support_t>
97-
get_shared_rosidl_serialization_support() const;
98-
9990
protected:
10091
RCLCPP_DISABLE_COPY(DynamicSerializationSupport)
10192

102-
std::shared_ptr<rosidl_dynamic_typesupport_serialization_support_t> rosidl_serialization_support_;
93+
private:
94+
rosidl_dynamic_typesupport_serialization_support_t rosidl_serialization_support_;
10395
};
10496

10597

rclcpp/src/rclcpp/dynamic_typesupport/dynamic_message.cpp

+3-10
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
#include <rosidl_dynamic_typesupport/api/dynamic_type.h>
1616
#include <rosidl_dynamic_typesupport/api/dynamic_data.h>
17+
#include <rosidl_dynamic_typesupport/api/serialization_support.h>
1718
#include <rosidl_dynamic_typesupport/types.h>
1819

1920
#include <memory>
@@ -248,20 +249,12 @@ DynamicMessage::match_serialization_support_(
248249
bool out = true;
249250

250251
if (serialization_support.get_serialization_library_identifier() != std::string(
251-
rosidl_dynamic_type_data.serialization_support->library_identifier))
252+
rosidl_dynamic_type_data.serialization_support->serialization_library_identifier))
252253
{
253254
RCUTILS_LOG_ERROR("serialization support library identifier does not match dynamic data's");
254255
out = false;
255256
}
256257

257-
// TODO(methylDragon): Can I do this?? Is it portable?
258-
if (serialization_support.get_rosidl_serialization_support() !=
259-
rosidl_dynamic_type_data.serialization_support)
260-
{
261-
RCUTILS_LOG_ERROR("serialization support pointer does not match dynamic data's");
262-
out = false;
263-
}
264-
265258
return out;
266259
}
267260

@@ -270,7 +263,7 @@ DynamicMessage::match_serialization_support_(
270263
const std::string
271264
DynamicMessage::get_serialization_library_identifier() const
272265
{
273-
return std::string(rosidl_dynamic_data_->serialization_support->library_identifier);
266+
return std::string(rosidl_dynamic_data_->serialization_support->serialization_library_identifier);
274267
}
275268

276269

rclcpp/src/rclcpp/dynamic_typesupport/dynamic_message_type.cpp

+9-13
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
#include <rosidl_dynamic_typesupport/api/dynamic_data.h>
1616
#include <rosidl_dynamic_typesupport/api/dynamic_type.h>
17+
#include <rosidl_dynamic_typesupport/api/serialization_support.h>
1718
#include <rosidl_dynamic_typesupport/types.h>
1819

1920
#include <memory>
@@ -160,7 +161,9 @@ DynamicMessageType::init_from_description(
160161

161162
rosidl_dynamic_typesupport_dynamic_type_t * rosidl_dynamic_type = nullptr;
162163
rcutils_ret_t ret = rosidl_dynamic_typesupport_dynamic_type_create_from_description(
163-
serialization_support_->get_rosidl_serialization_support(), &description, &rosidl_dynamic_type);
164+
&serialization_support_->get_rosidl_serialization_support(),
165+
&description,
166+
&rosidl_dynamic_type);
164167
if (ret != RCUTILS_RET_OK || !rosidl_dynamic_type) {
165168
throw std::runtime_error("could not create new dynamic type object");
166169
}
@@ -182,19 +185,12 @@ DynamicMessageType::match_serialization_support_(
182185
bool out = true;
183186

184187
if (serialization_support.get_serialization_library_identifier() != std::string(
185-
rosidl_dynamic_type.serialization_support->library_identifier))
188+
rosidl_dynamic_type.serialization_support->serialization_library_identifier))
186189
{
187190
RCUTILS_LOG_ERROR(
188-
"serialization support library identifier does not match dynamic type's");
189-
out = false;
190-
}
191-
192-
// TODO(methylDragon): Can I do this?? Is it portable?
193-
if (serialization_support.get_rosidl_serialization_support() !=
194-
rosidl_dynamic_type.serialization_support)
195-
{
196-
RCUTILS_LOG_ERROR(
197-
"serialization support pointer does not match dynamic type's");
191+
"serialization support library identifier does not match dynamic type's (%s vs %s)",
192+
serialization_support.get_serialization_library_identifier().c_str(),
193+
rosidl_dynamic_type.serialization_support->serialization_library_identifier);
198194
out = false;
199195
}
200196

@@ -206,7 +202,7 @@ DynamicMessageType::match_serialization_support_(
206202
const std::string
207203
DynamicMessageType::get_serialization_library_identifier() const
208204
{
209-
return std::string(rosidl_dynamic_type_->serialization_support->library_identifier);
205+
return std::string(rosidl_dynamic_type_->serialization_support->serialization_library_identifier);
210206
}
211207

212208

rclcpp/src/rclcpp/dynamic_typesupport/dynamic_message_type_builder.cpp

+7-14
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
#include <rosidl_dynamic_typesupport/api/dynamic_data.h>
1616
#include <rosidl_dynamic_typesupport/api/dynamic_type.h>
17+
#include <rosidl_dynamic_typesupport/api/serialization_support.h>
1718
#include <rosidl_dynamic_typesupport/types.h>
1819

1920
#include <memory>
@@ -154,7 +155,8 @@ DynamicMessageTypeBuilder::init_from_description(
154155

155156
rosidl_dynamic_typesupport_dynamic_type_builder_t * rosidl_dynamic_type_builder = nullptr;
156157
rcutils_ret_t ret = rosidl_dynamic_typesupport_dynamic_type_builder_create_from_description(
157-
serialization_support_->get_rosidl_serialization_support(), &description,
158+
&serialization_support_->get_rosidl_serialization_support(),
159+
&description,
158160
&rosidl_dynamic_type_builder);
159161
if (ret != RCUTILS_RET_OK || !rosidl_dynamic_type_builder) {
160162
throw std::runtime_error("could not create new dynamic type builder object");
@@ -177,14 +179,14 @@ DynamicMessageTypeBuilder::init_from_serialization_support_(
177179
if (!serialization_support) {
178180
throw std::runtime_error("serialization support cannot be nullptr!");
179181
}
180-
if (!serialization_support->get_rosidl_serialization_support()) {
182+
if (!&serialization_support->get_rosidl_serialization_support()) {
181183
throw std::runtime_error("serialization support raw pointer cannot be nullptr!");
182184
}
183185

184186

185187
rosidl_dynamic_typesupport_dynamic_type_builder_t * rosidl_dynamic_type_builder = nullptr;
186188
rcutils_ret_t ret = rosidl_dynamic_typesupport_dynamic_type_builder_create(
187-
serialization_support->get_rosidl_serialization_support(),
189+
&serialization_support->get_rosidl_serialization_support(),
188190
name.c_str(), name.size(),
189191
&rosidl_dynamic_type_builder);
190192
if (ret != RCUTILS_RET_OK) {
@@ -212,22 +214,13 @@ DynamicMessageTypeBuilder::match_serialization_support_(
212214
bool out = true;
213215

214216
if (serialization_support.get_serialization_library_identifier() != std::string(
215-
rosidl_dynamic_type_builder.serialization_support->library_identifier))
217+
rosidl_dynamic_type_builder.serialization_support->serialization_library_identifier))
216218
{
217219
RCUTILS_LOG_ERROR(
218220
"serialization support library identifier does not match dynamic type builder's");
219221
out = false;
220222
}
221223

222-
// TODO(methylDragon): Can I do this?? Is it portable?
223-
if (serialization_support.get_rosidl_serialization_support() !=
224-
rosidl_dynamic_type_builder.serialization_support)
225-
{
226-
RCUTILS_LOG_ERROR(
227-
"serialization support pointer does not match dynamic type builder's");
228-
out = false;
229-
}
230-
231224
return out;
232225
}
233226

@@ -236,7 +229,7 @@ DynamicMessageTypeBuilder::match_serialization_support_(
236229
const std::string
237230
DynamicMessageTypeBuilder::get_serialization_library_identifier() const
238231
{
239-
return std::string(rosidl_dynamic_type_builder_->serialization_support->library_identifier);
232+
return std::string(rosidl_dynamic_type_builder_->serialization_support->serialization_library_identifier);
240233
}
241234

242235

rclcpp/src/rclcpp/dynamic_typesupport/dynamic_message_type_support.cpp

+11-30
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ DynamicMessageTypeSupport::DynamicMessageTypeSupport(
6565
}
6666
if (ret != RCL_RET_OK) {
6767
std::string error_msg =
68-
std::string("error initializing rosidl message type support:\n") + rcl_get_error_string().str;
68+
std::string("error initializing rosidl message type support: ") + rcl_get_error_string().str;
6969
rcl_reset_error();
7070
throw std::runtime_error(error_msg);
7171
}
@@ -75,16 +75,17 @@ DynamicMessageTypeSupport::DynamicMessageTypeSupport(
7575
throw std::runtime_error("rosidl message type support is of the wrong type");
7676
}
7777

78-
auto ts_impl = static_cast<const rosidl_dynamic_message_type_support_impl_t *>(
79-
rosidl_message_type_support_.data);
78+
auto ts_impl = static_cast<rosidl_dynamic_message_type_support_impl_t *>(const_cast<void *>(
79+
rosidl_message_type_support_.data));
8080

81-
serialization_support_ = DynamicSerializationSupport::make_shared(ts_impl->serialization_support);
81+
serialization_support_ = DynamicSerializationSupport::make_shared(
82+
std::move(ts_impl->serialization_support));
8283

8384
dynamic_message_type_ = DynamicMessageType::make_shared(
84-
get_shared_dynamic_serialization_support(), ts_impl->dynamic_message_type);
85+
get_shared_dynamic_serialization_support(), std::move(ts_impl->dynamic_message_type));
8586

8687
dynamic_message_ = DynamicMessage::make_shared(
87-
get_shared_dynamic_serialization_support(), ts_impl->dynamic_message);
88+
get_shared_dynamic_serialization_support(), std::move(ts_impl->dynamic_message));
8889
}
8990

9091
DynamicMessageTypeSupport::DynamicMessageTypeSupport(
@@ -111,7 +112,7 @@ DynamicMessageTypeSupport::DynamicMessageTypeSupport(
111112
}
112113

113114
rcutils_ret_t ret = rosidl_dynamic_message_type_support_handle_init(
114-
serialization_support->get_rosidl_serialization_support(),
115+
&serialization_support->get_rosidl_serialization_support(),
115116
&type_hash, // type_hash
116117
&description, // type_description
117118
nullptr, // type_description_sources (not implemented for dynamic types)
@@ -174,40 +175,20 @@ DynamicMessageTypeSupport::DynamicMessageTypeSupport(
174175
"dynamic message library identifier.");
175176
}
176177

177-
// Check pointers
178-
/* *INDENT-OFF* */
179-
if (serialization_support->get_rosidl_serialization_support() !=
180-
dynamic_message_type
181-
->get_shared_dynamic_serialization_support()
182-
->get_rosidl_serialization_support())
183-
{
184-
throw std::runtime_error("serialization support pointer does not match dynamic message type's");
185-
}
186-
if (dynamic_message_type
187-
->get_shared_dynamic_serialization_support()
188-
->get_rosidl_serialization_support() !=
189-
dynamic_message_type
190-
->get_shared_dynamic_serialization_support()
191-
->get_rosidl_serialization_support())
192-
{
193-
throw std::runtime_error("serialization support does not match pointer dynamic message type's");
194-
}
195-
/* *INDENT-ON* */
196-
197178
rosidl_type_hash_t type_hash;
198179
rcutils_ret_t hash_ret = rcl_calculate_type_hash(
199180
// TODO(methylDragon): Swap this out with the conversion function when it is ready
200181
// from https://github.com/ros2/rcl/pull/1052
201182
reinterpret_cast<const type_description_interfaces__msg__TypeDescription *>(&description),
202183
&type_hash);
203184
if (hash_ret != RCL_RET_OK) {
204-
std::string error_msg = std::string("failed to get type hash:\n") + rcl_get_error_string().str;
185+
std::string error_msg = std::string("failed to get type hash: ") + rcl_get_error_string().str;
205186
rcl_reset_error();
206187
throw std::runtime_error(error_msg);
207188
}
208189

209190
auto ts_impl = static_cast<rosidl_dynamic_message_type_support_impl_t *>(
210-
allocator.zero_allocate(1, sizeof(rosidl_dynamic_message_type_support_impl_t), &allocator.state)
191+
allocator.zero_allocate(1, sizeof(rosidl_dynamic_message_type_support_impl_t), allocator.state)
211192
);
212193
if (!ts_impl) {
213194
throw std::runtime_error("could not allocate rosidl_message_type_support_t");
@@ -255,7 +236,7 @@ DynamicMessageTypeSupport::~DynamicMessageTypeSupport()
255236
rosidl_runtime_c__type_description__TypeDescription__fini(&ts_impl->type_description);
256237
rosidl_runtime_c__type_description__TypeSource__Sequence__fini(
257238
&ts_impl->type_description_sources);
258-
allocator.deallocate(static_cast<void *>(ts_impl), &allocator.state); // Always C allocated
239+
allocator.deallocate(static_cast<void *>(ts_impl), allocator.state); // Always C allocated
259240
}
260241

261242

0 commit comments

Comments
 (0)