Skip to content

Commit 7d0d91b

Browse files
committed
Refactor serialization support to use allocators and refs
Signed-off-by: methylDragon <[email protected]>
1 parent 69d2518 commit 7d0d91b

13 files changed

+431
-433
lines changed

CMakeLists.txt

-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ add_library(${PROJECT_NAME}
3636

3737
"src/dynamic_message_type_support_struct.c"
3838
"src/identifier.c"
39-
"src/types.c"
4039
)
4140
if(WIN32)
4241
target_compile_definitions(${PROJECT_NAME}

README.md

+8-5
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,16 @@ Properly implemented, a user should be able to, given a serialized buffer, the s
1010

1111
```cpp
1212
// Init Serialization Support (in this case, using FastRTPS)
13-
rosidl_dynamic_typesupport_serialization_support_t * serialization_support =
14-
rosidl_dynamic_typesupport_serialization_support_create(
15-
rosidl_dynamic_typesupport_fastrtps_create_serialization_support_impl(),
16-
rosidl_dynamic_typesupport_fastrtps_create_serialization_support_interface());
13+
rosidl_dynamic_typesupport_serialization_support_t serialization_support;
14+
rosidl_dynamic_typesupport_serialization_support_init(
15+
rosidl_dynamic_typesupport_fastrtps_init_serialization_support_impl(),
16+
rosidl_dynamic_typesupport_fastrtps_init_serialization_support_interface(),
17+
rcutils_get_default_allocator(),
18+
&serialization_support);
1719

1820
// Configure Dynamic Type Builder
19-
rosidl_dynamic_typesupport_dynamic_type_builder_t * flat_builder = rosidl_dynamic_typesupport_dynamic_type_builder_create(serialization_support, "flat");
21+
rosidl_dynamic_typesupport_dynamic_type_builder_t * flat_builder =
22+
rosidl_dynamic_typesupport_dynamic_type_builder_create(&serialization_support, "flat");
2023
rosidl_dynamic_typesupport_dynamic_type_builder_add_bool_member(flat_builder, 0, "bool_field");
2124
rosidl_dynamic_typesupport_dynamic_type_builder_add_int32_member(flat_builder, 1, "int32_field");
2225
rosidl_dynamic_typesupport_dynamic_type_builder_add_string_member(flat_builder, 2, "string_field");

include/rosidl_dynamic_typesupport/api/dynamic_data.h

+27-3
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,34 @@ extern "C" {
2424

2525
#include <rcutils/types/rcutils_ret.h>
2626
#include <rcutils/types/uint8_array.h>
27-
#include <rosidl_dynamic_typesupport/api/serialization_support_interface.h>
28-
#include <rosidl_dynamic_typesupport/visibility_control.h>
29-
#include <rosidl_dynamic_typesupport/uchar.h>
3027

28+
#include "rosidl_dynamic_typesupport/api/serialization_support.h"
29+
#include "rosidl_dynamic_typesupport/api/serialization_support_interface.h"
30+
#include "rosidl_dynamic_typesupport/visibility_control.h"
31+
#include "rosidl_dynamic_typesupport/types.h"
32+
#include "rosidl_dynamic_typesupport/uchar.h"
33+
34+
// Dynamic Data Impl
35+
struct rosidl_dynamic_typesupport_dynamic_data_impl_s
36+
{
37+
void * handle;
38+
};
39+
40+
ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC
41+
rosidl_dynamic_typesupport_dynamic_data_impl_t
42+
rosidl_dynamic_typesupport_get_zero_initialized_dynamic_data_impl(void);
43+
44+
// Dynamic Data
45+
struct rosidl_dynamic_typesupport_dynamic_data_s
46+
{
47+
rosidl_dynamic_typesupport_dynamic_data_impl_t * impl;
48+
// !!! Lifetime is NOT managed by this struct
49+
rosidl_dynamic_typesupport_serialization_support_t * serialization_support;
50+
};
51+
52+
ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC
53+
rosidl_dynamic_typesupport_dynamic_data_t
54+
rosidl_dynamic_typesupport_get_zero_initialized_dynamic_data(void);
3155

3256
// ===============================================================================================
3357
// DYNAMIC DATA

include/rosidl_dynamic_typesupport/api/dynamic_type.h

+47-2
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,54 @@ extern "C" {
2424

2525
#include <rcutils/types/rcutils_ret.h>
2626

27-
#include <rosidl_dynamic_typesupport/api/serialization_support_interface.h>
28-
#include <rosidl_dynamic_typesupport/visibility_control.h>
27+
#include "rosidl_dynamic_typesupport/api/serialization_support.h"
28+
#include "rosidl_dynamic_typesupport/api/serialization_support_interface.h"
29+
#include "rosidl_dynamic_typesupport/types.h"
30+
#include "rosidl_dynamic_typesupport/visibility_control.h"
2931

32+
// Dynamic Type Builder Impl
33+
struct rosidl_dynamic_typesupport_dynamic_type_builder_impl_s
34+
{
35+
void * handle;
36+
};
37+
38+
ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC
39+
rosidl_dynamic_typesupport_dynamic_type_builder_impl_t
40+
rosidl_dynamic_typesupport_get_zero_initialized_dynamic_type_builder_impl(void);
41+
42+
// Dynamic Type Builder
43+
struct rosidl_dynamic_typesupport_dynamic_type_builder_s
44+
{
45+
rosidl_dynamic_typesupport_dynamic_type_builder_impl_t * impl;
46+
// !!! Lifetime is NOT managed by this struct
47+
rosidl_dynamic_typesupport_serialization_support_t * serialization_support;
48+
};
49+
50+
ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC
51+
rosidl_dynamic_typesupport_dynamic_type_builder_t
52+
rosidl_dynamic_typesupport_get_zero_initialized_dynamic_type_builder(void);
53+
54+
// Dynamic Type Impl
55+
struct rosidl_dynamic_typesupport_dynamic_type_impl_s
56+
{
57+
void * handle;
58+
};
59+
60+
ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC
61+
rosidl_dynamic_typesupport_dynamic_type_impl_t
62+
rosidl_dynamic_typesupport_get_zero_initialized_dynamic_type_impl(void);
63+
64+
// Dynamic Type
65+
struct rosidl_dynamic_typesupport_dynamic_type_s
66+
{
67+
rosidl_dynamic_typesupport_dynamic_type_impl_t * impl;
68+
// !!! Lifetime is NOT managed by this struct
69+
rosidl_dynamic_typesupport_serialization_support_t * serialization_support;
70+
};
71+
72+
ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC
73+
rosidl_dynamic_typesupport_dynamic_type_t
74+
rosidl_dynamic_typesupport_get_zero_initialized_dynamic_type(void);
3075

3176
// =================================================================================================
3277
// DYNAMIC TYPE

include/rosidl_dynamic_typesupport/api/serialization_support.h

+38-6
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,47 @@
2222
extern "C" {
2323
#endif
2424

25-
#include <rosidl_dynamic_typesupport/types.h>
26-
2725
#include <rosidl_dynamic_typesupport/api/serialization_support_interface.h>
2826
#include <rosidl_dynamic_typesupport/api/dynamic_data.h>
2927
#include <rosidl_dynamic_typesupport/api/dynamic_type.h>
3028
#include <rosidl_dynamic_typesupport/visibility_control.h>
3129

3230
#include <rcutils/types/rcutils_ret.h>
3331

32+
#include "rosidl_dynamic_typesupport/types.h"
33+
34+
/// Serialization Support Impl
35+
/// For anything necessary or useful for the operation of the serialization lib
36+
/// (e.g. singleton dynamic type and dynamic data factories)
37+
struct rosidl_dynamic_typesupport_serialization_support_impl_s
38+
{
39+
rcutils_allocator_t allocator;
40+
const char * serialization_library_identifier;
41+
void * handle;
42+
};
43+
44+
ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC
45+
rosidl_dynamic_typesupport_serialization_support_impl_t
46+
rosidl_dynamic_typesupport_get_zero_initialized_serialization_support_impl(void);
47+
48+
/// Serialization Support
49+
/// This is the main structure that encompasses:
50+
/// - impl - The library-specific objects or implementation details
51+
/// - methods - The shared serialization support interface, populated with serialization
52+
/// library-specific function pointers
53+
struct rosidl_dynamic_typesupport_serialization_support_s
54+
{
55+
rcutils_allocator_t allocator;
56+
const char * serialization_library_identifier;
57+
58+
rosidl_dynamic_typesupport_serialization_support_impl_t impl;
59+
// Can't call it `interface` because it's a reserved term in some Windows versions...
60+
rosidl_dynamic_typesupport_serialization_support_interface_t methods;
61+
};
62+
63+
ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC
64+
rosidl_dynamic_typesupport_serialization_support_t
65+
rosidl_dynamic_typesupport_get_zero_initialized_serialization_support(void);
3466

3567
// CORE ============================================================================================
3668
ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC
@@ -40,17 +72,17 @@ rosidl_dynamic_typesupport_serialization_support_get_library_identifier(
4072

4173
ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC
4274
rcutils_ret_t
43-
rosidl_dynamic_typesupport_serialization_support_create(
75+
rosidl_dynamic_typesupport_serialization_support_init(
4476
rosidl_dynamic_typesupport_serialization_support_impl_t * impl,
4577
rosidl_dynamic_typesupport_serialization_support_interface_t * methods,
46-
rosidl_dynamic_typesupport_serialization_support_t ** serialization_support); // OUT
78+
rcutils_allocator_t * allocator,
79+
rosidl_dynamic_typesupport_serialization_support_t * serialization_support); // OUT
4780

4881
ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC
4982
rcutils_ret_t
50-
rosidl_dynamic_typesupport_serialization_support_destroy(
83+
rosidl_dynamic_typesupport_serialization_support_fini(
5184
rosidl_dynamic_typesupport_serialization_support_t * serialization_support);
5285

53-
5486
#ifdef __cplusplus
5587
}
5688
#endif

include/rosidl_dynamic_typesupport/api/serialization_support_interface.h

+10-5
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,11 @@ extern "C" {
2727

2828
#include <rcutils/types/rcutils_ret.h>
2929
#include <rcutils/types/uint8_array.h>
30-
#include <rosidl_dynamic_typesupport/types.h>
31-
#include <rosidl_dynamic_typesupport/uchar.h>
3230
#include <rosidl_runtime_c/type_description/type_description__struct.h>
3331

32+
#include "rosidl_dynamic_typesupport/types.h"
33+
#include "rosidl_dynamic_typesupport/uchar.h"
34+
3435
/// This interface must be adopted by all downstream serialization library implementations
3536

3637
// =================================================================================================
@@ -53,12 +54,13 @@ struct rosidl_dynamic_typesupport_serialization_support_interface_s
5354
*/
5455

5556
// CORE
56-
const char * library_identifier;
57+
rcutils_allocator_t allocator;
58+
const char * serialization_library_identifier;
5759

58-
rcutils_ret_t (* serialization_support_impl_destroy)(
60+
rcutils_ret_t (* serialization_support_impl_fini)(
5961
rosidl_dynamic_typesupport_serialization_support_impl_t * impl);
6062

61-
rcutils_ret_t (* serialization_support_interface_destroy)(
63+
rcutils_ret_t (* serialization_support_interface_fini)(
6264
rosidl_dynamic_typesupport_serialization_support_interface_t * methods);
6365

6466
// ===============================================================================================
@@ -1382,6 +1384,9 @@ struct rosidl_dynamic_typesupport_serialization_support_interface_s
13821384
rosidl_dynamic_typesupport_member_id_t * out_id); // OUT
13831385
};
13841386

1387+
ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC
1388+
rosidl_dynamic_typesupport_serialization_support_interface_t
1389+
rosidl_dynamic_typesupport_get_zero_initialized_serialization_support_interface(void);
13851390

13861391
#ifdef __cplusplus
13871392
}

include/rosidl_dynamic_typesupport/dynamic_message_type_support_struct.h

+4-2
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ extern "C"
2525
#include <rosidl_runtime_c/type_description/type_description__struct.h>
2626
#include <rosidl_runtime_c/type_description/type_source__struct.h>
2727

28+
#include "rosidl_dynamic_typesupport/api/dynamic_type.h"
29+
#include "rosidl_dynamic_typesupport/api/dynamic_data.h"
2830
#include "rosidl_dynamic_typesupport/api/serialization_support.h"
2931
#include "rosidl_dynamic_typesupport/identifier.h"
3032
#include "rosidl_dynamic_typesupport/types.h"
@@ -56,7 +58,7 @@ typedef struct rosidl_dynamic_message_type_support_impl_s
5658
// Unused for now, but placed here just in case
5759
rosidl_runtime_c__type_description__TypeSource__Sequence type_description_sources;
5860

59-
rosidl_dynamic_typesupport_serialization_support_t * serialization_support;
61+
rosidl_dynamic_typesupport_serialization_support_t serialization_support;
6062

6163
// The dynamic_message_type allows us to do a one time alloc and reuse it for subscription
6264
// creation and data creation
@@ -105,7 +107,7 @@ ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC
105107
rcutils_ret_t
106108
rosidl_dynamic_message_type_support_handle_fini(rosidl_message_type_support_t * ts);
107109

108-
/// Initialized a `rosidl_dynamic_message_type_support_impl_t` with bound message description
110+
/// Initialized a `rosidl_dynamic_message_type_support_impl_t` with encapsulated message description
109111
/**
110112
* The `type_hash`, `type_description`, `type_description_sources`, and `allocator` arguments are
111113
* copied.

0 commit comments

Comments
 (0)