From 8b1314e335863722929e7d3c659655c1f574f1de Mon Sep 17 00:00:00 2001 From: Alejandro Hernandez Cordero Date: Fri, 16 Oct 2026 15:01:22 +0200 Subject: [PATCH 1/2] Fix data race in IntraProcessManager::lowest_available_capacity Signed-off-by: Alejandro Hernandez Cordero --- rclcpp/src/rclcpp/intra_process_manager.cpp | 2 ++ rclcpp/test/rclcpp/test_publisher.cpp | 27 +++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/rclcpp/src/rclcpp/intra_process_manager.cpp b/rclcpp/src/rclcpp/intra_process_manager.cpp index 2cfc5386d8..adb2975066 100644 --- a/rclcpp/src/rclcpp/intra_process_manager.cpp +++ b/rclcpp/src/rclcpp/intra_process_manager.cpp @@ -236,6 +236,8 @@ IntraProcessManager::can_communicate( size_t IntraProcessManager::lowest_available_capacity(const uint64_t intra_process_publisher_id) const { + std::shared_lock lock(mutex_); + size_t capacity = std::numeric_limits::max(); auto publisher_it = pub_to_subs_.find(intra_process_publisher_id); diff --git a/rclcpp/test/rclcpp/test_publisher.cpp b/rclcpp/test/rclcpp/test_publisher.cpp index 9e7a5d6ed0..dd20e724e9 100644 --- a/rclcpp/test/rclcpp/test_publisher.cpp +++ b/rclcpp/test/rclcpp/test_publisher.cpp @@ -14,12 +14,14 @@ #include +#include #include #include #include #include #include #include +#include #include #include @@ -701,6 +703,31 @@ TEST_F(TestPublisher, lowest_available_ipm_capacity) { ASSERT_EQ(history_depth - 1u, pub_ipm_enabled->lowest_available_ipm_capacity()); } +TEST_F(TestPublisher, lowest_available_ipm_capacity_concurrent_subscriptions) { + initialize(rclcpp::NodeOptions().use_intra_process_comms(true)); + + auto pub = node->create_publisher("topic", 10); + auto do_nothing = [](std::shared_ptr) {}; + + // Query the capacity while intra-process subscriptions are added and removed. + std::atomic done{false}; + std::thread reader([&pub, &done]() { + while (!done) { + pub->lowest_available_ipm_capacity(); + } + }); + + for (int i = 0; i < 50; ++i) { + std::vector::SharedPtr> subs; + for (int j = 0; j < 20; ++j) { + subs.push_back(node->create_subscription("topic", 10, do_nothing)); + } + } + done = true; + reader.join(); + EXPECT_EQ(0u, pub->lowest_available_ipm_capacity()); +} + INSTANTIATE_TEST_SUITE_P( TestWaitForAllAckedWithParm, TestPublisherWaitForAllAcked, From 951bf9afac64cba4d2ed3515e36981d9686c8bfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Hern=C3=A1ndez=20Cordero?= Date: Mon, 19 Oct 2026 20:17:20 +0200 Subject: [PATCH 2/2] Update rclcpp/src/rclcpp/intra_process_manager.cpp MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Tomoya Fujita Signed-off-by: Alejandro Hernández Cordero --- rclcpp/src/rclcpp/intra_process_manager.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rclcpp/src/rclcpp/intra_process_manager.cpp b/rclcpp/src/rclcpp/intra_process_manager.cpp index adb2975066..ada6812c5b 100644 --- a/rclcpp/src/rclcpp/intra_process_manager.cpp +++ b/rclcpp/src/rclcpp/intra_process_manager.cpp @@ -236,10 +236,10 @@ IntraProcessManager::can_communicate( size_t IntraProcessManager::lowest_available_capacity(const uint64_t intra_process_publisher_id) const { - std::shared_lock lock(mutex_); - size_t capacity = std::numeric_limits::max(); + std::shared_lock lock(mutex_); + auto publisher_it = pub_to_subs_.find(intra_process_publisher_id); if (publisher_it == pub_to_subs_.end()) { // Publisher is either invalid or no longer exists.