Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 46 additions & 0 deletions repositories/patches/rmw_cyclonedds-cache-writers.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
diff --git rmw_cyclonedds_cpp/src/rmw_node.cpp rmw_cyclonedds_cpp/src/rmw_node.cpp
index 740ae8b..d2b76a2 100644
--- rmw_cyclonedds_cpp/src/rmw_node.cpp
+++ rmw_cyclonedds_cpp/src/rmw_node.cpp
@@ -181,6 +181,12 @@ static rmw_ret_t destroy_guard_condition(rmw_guard_condition_t * gc);
struct CddsDomain;
struct CddsWaitset;

+static std::unordered_map<const rosidl_message_type_support_t*, std::unique_ptr<rmw_cyclonedds_cpp::BaseCDRWriter>>& get_writers()
+{
+ static std::unordered_map<const rosidl_message_type_support_t*, std::unique_ptr<rmw_cyclonedds_cpp::BaseCDRWriter>> writers;
+ return writers;
+}
+
struct Cdds
{
std::mutex lock;
@@ -1494,6 +1500,7 @@ extern "C" rmw_ret_t rmw_context_fini(rmw_context_t * context)
return RMW_RET_INVALID_ARGUMENT;
}
rmw_ret_t ret = rmw_init_options_fini(&context->options);
+ get_writers().clear();
delete context->impl;
*context = rmw_get_zero_initialized_context();
return ret;
@@ -1674,8 +1681,18 @@ extern "C" rmw_ret_t rmw_serialize(
rmw_serialized_message_t * serialized_message)
{
try {
- auto writer = rmw_cyclonedds_cpp::make_cdr_writer(
- rmw_cyclonedds_cpp::make_message_value_type(type_support));
+ static std::mutex writers_mutex;
+ rmw_cyclonedds_cpp::BaseCDRWriter* writer;
+ std::lock_guard<std::mutex> writers_lock(writers_mutex);
+ {
+ auto& writers = get_writers();
+ auto it = writers.find(type_support);
+ if (it == writers.end()) {
+ std::tie(it, std::ignore) = writers.emplace(type_support, rmw_cyclonedds_cpp::make_cdr_writer(
+ rmw_cyclonedds_cpp::make_message_value_type(type_support)));
+ }
+ writer = it->second.get();
+ }

auto size = writer->get_serialized_size(ros_message);
rmw_ret_t ret = rmw_serialized_message_resize(serialized_message, size);
32 changes: 32 additions & 0 deletions repositories/patches/rmw_cyclonedds-lsan.-510.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
diff --git rmw_cyclonedds_cpp/src/rmw_node.cpp rmw_cyclonedds_cpp/src/rmw_node.cpp
index af641101..83bd1928 100644
--- rmw_cyclonedds_cpp/src/rmw_node.cpp
+++ rmw_cyclonedds_cpp/src/rmw_node.cpp
@@ -191,6 +191,17 @@ struct Cdds
{}
};

+#if defined(__has_feature)
+#if __has_feature(address_sanitizer) // for clang
+#define __SANITIZE_ADDRESS__ // GCC already sets this
+#endif
+#endif
+
+#if defined(__SANITIZE_ADDRESS__)
+#include <sanitizer/lsan_interface.h>
+#endif
+
+
/* Use construct-on-first-use for the global state rather than a plain global variable to
prevent its destructor from running prior to last use by some other component in the
system. E.g., some rclcpp tests (at the time of this commit) drop a guard condition in
@@ -209,6 +220,9 @@ struct Cdds
static Cdds & gcdds()
{
static Cdds * x = new Cdds();
+#if defined(__SANITIZE_ADDRESS__)
+ __lsan_ignore_object(x);
+#endif
return *x;
}

4 changes: 4 additions & 0 deletions repositories/ros2_repositories_impl.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -231,6 +231,10 @@ def ros2_repositories_impl():
http_archive,
name = "ros2_rmw_cyclonedds",
build_file = "@com_github_mvukov_rules_ros2//repositories:rmw_cyclonedds.BUILD.bazel",
patches = [
"@com_github_mvukov_rules_ros2//repositories/patches:rmw_cyclonedds-lsan.-510.patch",
"@com_github_mvukov_rules_ros2//repositories/patches:rmw_cyclonedds-cache-writers.patch",
],
sha256 = "58ef4fe3fd18eb723906df77eb10df1e69222b451e479c6ec85426ba48e16a8a",
strip_prefix = "rmw_cyclonedds-1.3.4",
url = "https://github.com/ros2/rmw_cyclonedds/archive/refs/tags/1.3.4.tar.gz",
Expand Down