From 24c5ef29dd9f424940cab833eba76f3d36a7a3d4 Mon Sep 17 00:00:00 2001 From: xuxiaoqiang Date: Wed, 3 Jul 2019 16:11:35 +0800 Subject: [PATCH] fix modules coredump due to data race in shm_manager --- ros/ros_comm/roscpp/include/ros/subscription.h | 1 + ros/ros_comm/roscpp/src/libros/shm_manager.cpp | 4 ++-- ros/ros_comm/roscpp/src/libros/topic_manager.cpp | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/ros/ros_comm/roscpp/include/ros/subscription.h b/ros/ros_comm/roscpp/include/ros/subscription.h index 5b01f08..dce5fdd 100644 --- a/ros/ros_comm/roscpp/include/ros/subscription.h +++ b/ros/ros_comm/roscpp/include/ros/subscription.h @@ -268,6 +268,7 @@ class ROSCPP_DECL Subscription : public boost::enable_shared_from_this get_publisher_links() { + boost::mutex::scoped_lock lock(publisher_links_mutex_); return publisher_links_; } }; diff --git a/ros/ros_comm/roscpp/src/libros/shm_manager.cpp b/ros/ros_comm/roscpp/src/libros/shm_manager.cpp index ccd15f5..663e212 100644 --- a/ros/ros_comm/roscpp/src/libros/shm_manager.cpp +++ b/ros/ros_comm/roscpp/src/libros/shm_manager.cpp @@ -136,7 +136,7 @@ void ShmManager::threadFunc() if (g_config_comm.topic_white_list.find(topic) != g_config_comm.topic_white_list.end() || shm_map_.find(topic) != shm_map_.end() || - (*it)->get_publisher_links().size() == 0) + (*it)->getNumPublishers() == 0) { continue; } @@ -243,7 +243,7 @@ void ShmManager::threadFunc() // Block needs to be allocated if (read_index == sharedmem_transport::ROS_SHM_SEGMENT_WROTE_NUM || - shm_map_[topic].shm_sub_ptr->get_publisher_links().size() == 0) + shm_map_[topic].shm_sub_ptr->getNumPublishers() == 0) { { boost::mutex::scoped_lock lock(shm_map_mutex_); diff --git a/ros/ros_comm/roscpp/src/libros/topic_manager.cpp b/ros/ros_comm/roscpp/src/libros/topic_manager.cpp index 08d4025..b9e9f57 100644 --- a/ros/ros_comm/roscpp/src/libros/topic_manager.cpp +++ b/ros/ros_comm/roscpp/src/libros/topic_manager.cpp @@ -229,6 +229,7 @@ SubscriptionPtr TopicManager::lookupSubscription(const std::string& topic) L_Subscription TopicManager::getAllSubscription() { + boost::mutex::scoped_lock lock(subs_mutex_); return subscriptions_ ; }