From 38fe220c4016ac4d9b2c84dc507c9c3ee65b9af6 Mon Sep 17 00:00:00 2001 From: Miguel Company Date: Tue, 28 May 2019 15:48:03 +0200 Subject: [PATCH] Protection of discovered_names and discovered_namespaces Signed-off-by: Miguel Company --- .../custom_participant_info.hpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/rmw_fastrtps_shared_cpp/include/rmw_fastrtps_shared_cpp/custom_participant_info.hpp b/rmw_fastrtps_shared_cpp/include/rmw_fastrtps_shared_cpp/custom_participant_info.hpp index c0ad97fdb..eb6fbc4fe 100644 --- a/rmw_fastrtps_shared_cpp/include/rmw_fastrtps_shared_cpp/custom_participant_info.hpp +++ b/rmw_fastrtps_shared_cpp/include/rmw_fastrtps_shared_cpp/custom_participant_info.hpp @@ -24,6 +24,7 @@ #include "fastrtps/participant/Participant.h" #include "fastrtps/participant/ParticipantListener.h" +#include "rcpputils/thread_safety_annotations.hpp" #include "rcutils/logging_macros.h" #include "rmw/impl/cpp/key_value.hpp" @@ -68,6 +69,7 @@ class ParticipantListener : public eprosima::fastrtps::ParticipantListener return; } + std::lock_guard guard(names_mutex_); if (eprosima::fastrtps::rtps::ParticipantDiscoveryInfo::DISCOVERED_PARTICIPANT == info.status) { // ignore already known GUIDs if (discovered_names.find(info.info.m_guid) == discovered_names.end()) { @@ -115,6 +117,7 @@ class ParticipantListener : public eprosima::fastrtps::ParticipantListener std::vector get_discovered_names() const { + std::lock_guard guard(names_mutex_); std::vector names(discovered_names.size()); size_t i = 0; for (auto it : discovered_names) { @@ -125,6 +128,7 @@ class ParticipantListener : public eprosima::fastrtps::ParticipantListener std::vector get_discovered_namespaces() const { + std::lock_guard guard(names_mutex_); std::vector namespaces(discovered_namespaces.size()); size_t i = 0; for (auto it : discovered_namespaces) { @@ -179,8 +183,10 @@ class ParticipantListener : public eprosima::fastrtps::ParticipantListener } } - std::map discovered_names; - std::map discovered_namespaces; + using guid_map_t = std::map; + mutable std::mutex names_mutex_; + guid_map_t discovered_names RCPPUTILS_TSA_GUARDED_BY(names_mutex_); + guid_map_t discovered_namespaces RCPPUTILS_TSA_GUARDED_BY(names_mutex_); LockedObject reader_topic_cache; LockedObject writer_topic_cache; rmw_guard_condition_t * graph_guard_condition_;