diff --git a/rclcpp/include/rclcpp/executors/static_executor_entities_collector.hpp b/rclcpp/include/rclcpp/executors/static_executor_entities_collector.hpp index 0df25fde9d..604f20ddf9 100644 --- a/rclcpp/include/rclcpp/executors/static_executor_entities_collector.hpp +++ b/rclcpp/include/rclcpp/executors/static_executor_entities_collector.hpp @@ -62,6 +62,11 @@ class StaticExecutorEntitiesCollector final rclcpp::memory_strategy::MemoryStrategy::SharedPtr & memory_strategy, rcl_guard_condition_t * executor_guard_condition); + /// Finalize StaticExecutorEntitiesCollector to clear resources + RCLCPP_PUBLIC + void + fini(); + RCLCPP_PUBLIC void execute() override; diff --git a/rclcpp/include/rclcpp/executors/static_single_threaded_executor.hpp b/rclcpp/include/rclcpp/executors/static_single_threaded_executor.hpp index 9d39ba8e90..d007988f1f 100644 --- a/rclcpp/include/rclcpp/executors/static_single_threaded_executor.hpp +++ b/rclcpp/include/rclcpp/executors/static_single_threaded_executor.hpp @@ -163,6 +163,7 @@ class StaticSingleThreadedExecutor : public rclcpp::Executor std::chrono::nanoseconds timeout_left = timeout_ns; entities_collector_->init(&wait_set_, memory_strategy_, &interrupt_guard_condition_); + RCLCPP_SCOPE_EXIT(entities_collector_->fini()); while (rclcpp::ok(this->context_)) { // Do one set of work. diff --git a/rclcpp/src/rclcpp/executors/static_executor_entities_collector.cpp b/rclcpp/src/rclcpp/executors/static_executor_entities_collector.cpp index 5461e665ab..7d514b2761 100644 --- a/rclcpp/src/rclcpp/executors/static_executor_entities_collector.cpp +++ b/rclcpp/src/rclcpp/executors/static_executor_entities_collector.cpp @@ -62,6 +62,13 @@ StaticExecutorEntitiesCollector::init( execute(); } +void +StaticExecutorEntitiesCollector::fini() +{ + memory_strategy_->clear_handles(); + exec_list_.clear(); +} + void StaticExecutorEntitiesCollector::execute() { diff --git a/rclcpp/src/rclcpp/executors/static_single_threaded_executor.cpp b/rclcpp/src/rclcpp/executors/static_single_threaded_executor.cpp index 728a0902a1..ced388023d 100644 --- a/rclcpp/src/rclcpp/executors/static_single_threaded_executor.cpp +++ b/rclcpp/src/rclcpp/executors/static_single_threaded_executor.cpp @@ -41,6 +41,7 @@ StaticSingleThreadedExecutor::spin() // Set memory_strategy_ and exec_list_ based on weak_nodes_ // Prepare wait_set_ based on memory_strategy_ entities_collector_->init(&wait_set_, memory_strategy_, &interrupt_guard_condition_); + RCLCPP_SCOPE_EXIT(entities_collector_->fini()); while (rclcpp::ok(this->context_) && spinning.load()) { // Refresh wait set and wait for work diff --git a/rclcpp/test/CMakeLists.txt b/rclcpp/test/CMakeLists.txt index 67333552d8..873b9932b7 100644 --- a/rclcpp/test/CMakeLists.txt +++ b/rclcpp/test/CMakeLists.txt @@ -102,18 +102,6 @@ if(TARGET test_create_subscription) "test_msgs" ) endif() -<<<<<<< HEAD -======= -ament_add_gtest(test_add_callback_groups_to_executor - rclcpp/test_add_callback_groups_to_executor.cpp - TIMEOUT 120) -if(TARGET test_add_callback_groups_to_executor) - target_link_libraries(test_add_callback_groups_to_executor ${PROJECT_NAME}) - ament_target_dependencies(test_add_callback_groups_to_executor - "test_msgs" - ) -endif() ->>>>>>> 31c202e... Increase test timeouts of slow running tests with rmw_connext_cpp (#1400) ament_add_gtest(test_expand_topic_or_service_name rclcpp/test_expand_topic_or_service_name.cpp) if(TARGET test_expand_topic_or_service_name) ament_target_dependencies(test_expand_topic_or_service_name diff --git a/rclcpp/test/rclcpp/executors/test_executors.cpp b/rclcpp/test/rclcpp/executors/test_executors.cpp index ac244594b8..e6beba61ad 100644 --- a/rclcpp/test/rclcpp/executors/test_executors.cpp +++ b/rclcpp/test/rclcpp/executors/test_executors.cpp @@ -259,6 +259,14 @@ class TestWaitable : public rclcpp::Waitable } } + ~TestWaitable() + { + rcl_ret_t ret = rcl_guard_condition_fini(&gc_); + if (RCL_RET_OK != ret) { + fprintf(stderr, "failed to call rcl_guard_condition_fini\n"); + } + } + bool add_to_wait_set(rcl_wait_set_t * wait_set) override { diff --git a/rclcpp/test/rclcpp/executors/test_static_executor_entities_collector.cpp b/rclcpp/test/rclcpp/executors/test_static_executor_entities_collector.cpp index 92ded7fe5a..6b2d0d1513 100644 --- a/rclcpp/test/rclcpp/executors/test_static_executor_entities_collector.cpp +++ b/rclcpp/test/rclcpp/executors/test_static_executor_entities_collector.cpp @@ -159,6 +159,7 @@ TEST_F(TestStaticExecutorEntitiesCollector, add_remove_basic_node) { rcl_guard_condition_t rcl_guard_condition = guard_condition.get_rcl_guard_condition(); entities_collector_->init(&wait_set, memory_strategy, &rcl_guard_condition); + RCLCPP_SCOPE_EXIT(entities_collector_->fini()); EXPECT_EQ( expected_number_of_entities->subscriptions, entities_collector_->get_number_of_subscriptions()); @@ -206,6 +207,7 @@ TEST_F(TestStaticExecutorEntitiesCollector, add_remove_node_out_of_scope) { // Expect weak_node pointers to be cleaned up and used entities_collector_->init(&wait_set, memory_strategy, &rcl_guard_condition); + RCLCPP_SCOPE_EXIT(entities_collector_->fini()); EXPECT_EQ(0u, entities_collector_->get_number_of_subscriptions()); EXPECT_EQ(0u, entities_collector_->get_number_of_timers()); EXPECT_EQ(0u, entities_collector_->get_number_of_services()); @@ -267,6 +269,7 @@ TEST_F(TestStaticExecutorEntitiesCollector, add_remove_node_with_entities) { rcl_guard_condition_t rcl_guard_condition = guard_condition.get_rcl_guard_condition(); entities_collector_->init(&wait_set, memory_strategy, &rcl_guard_condition); + RCLCPP_SCOPE_EXIT(entities_collector_->fini()); EXPECT_EQ( 1u + expected_number_of_entities->subscriptions,