From 6d5d903c22623ab01c4c00b43753f9dc26011a59 Mon Sep 17 00:00:00 2001 From: Chen Lihui Date: Fri, 11 Sep 2020 15:23:02 +0800 Subject: [PATCH 1/6] Clear members for StaticExecutorEntitiesCollector to avoid shared_ptr dependency Signed-off-by: Chen Lihui --- .../executors/static_executor_entities_collector.hpp | 7 ++++++- .../executors/static_single_threaded_executor.hpp | 11 ++++++++--- .../executors/static_executor_entities_collector.cpp | 9 ++++++++- .../executors/static_single_threaded_executor.cpp | 2 ++ rclcpp/test/rclcpp/executors/test_executors.cpp | 8 ++++++++ 5 files changed, 32 insertions(+), 5 deletions(-) diff --git a/rclcpp/include/rclcpp/executors/static_executor_entities_collector.hpp b/rclcpp/include/rclcpp/executors/static_executor_entities_collector.hpp index b00d29c774..6525fa360b 100644 --- a/rclcpp/include/rclcpp/executors/static_executor_entities_collector.hpp +++ b/rclcpp/include/rclcpp/executors/static_executor_entities_collector.hpp @@ -64,9 +64,14 @@ class StaticExecutorEntitiesCollector final void init( rcl_wait_set_t * p_wait_set, - rclcpp::memory_strategy::MemoryStrategy::SharedPtr & memory_strategy, + 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 d286ee150b..a785f81497 100644 --- a/rclcpp/include/rclcpp/executors/static_single_threaded_executor.hpp +++ b/rclcpp/include/rclcpp/executors/static_single_threaded_executor.hpp @@ -194,6 +194,7 @@ class StaticSingleThreadedExecutor : public rclcpp::Executor entities_collector_->init(&wait_set_, memory_strategy_, &interrupt_guard_condition_); + rclcpp::FutureReturnCode ret = rclcpp::FutureReturnCode::INTERRUPTED; while (rclcpp::ok(this->context_)) { // Do one set of work. entities_collector_->refresh_wait_set(timeout_left); @@ -201,7 +202,8 @@ class StaticSingleThreadedExecutor : public rclcpp::Executor // Check if the future is set, return SUCCESS if it is. status = future.wait_for(std::chrono::seconds(0)); if (status == std::future_status::ready) { - return rclcpp::FutureReturnCode::SUCCESS; + ret = rclcpp::FutureReturnCode::SUCCESS; + break; } // If the original timeout is < 0, then this is blocking, never TIMEOUT. if (timeout_ns < std::chrono::nanoseconds::zero()) { @@ -210,14 +212,17 @@ class StaticSingleThreadedExecutor : public rclcpp::Executor // Otherwise check if we still have time to wait, return TIMEOUT if not. auto now = std::chrono::steady_clock::now(); if (now >= end_time) { - return rclcpp::FutureReturnCode::TIMEOUT; + ret = rclcpp::FutureReturnCode::TIMEOUT; + break; } // Subtract the elapsed time from the original timeout. timeout_left = std::chrono::duration_cast(end_time - now); } + entities_collector_->fini(); + // The future did not complete before ok() returned false, return INTERRUPTED. - return rclcpp::FutureReturnCode::INTERRUPTED; + return ret; } /// Not yet implemented, see https://github.com/ros2/rclcpp/issues/1219 for tracking diff --git a/rclcpp/src/rclcpp/executors/static_executor_entities_collector.cpp b/rclcpp/src/rclcpp/executors/static_executor_entities_collector.cpp index 0b81c10069..ba9f8fdcce 100644 --- a/rclcpp/src/rclcpp/executors/static_executor_entities_collector.cpp +++ b/rclcpp/src/rclcpp/executors/static_executor_entities_collector.cpp @@ -61,7 +61,7 @@ StaticExecutorEntitiesCollector::~StaticExecutorEntitiesCollector() void StaticExecutorEntitiesCollector::init( rcl_wait_set_t * p_wait_set, - rclcpp::memory_strategy::MemoryStrategy::SharedPtr & memory_strategy, + rclcpp::memory_strategy::MemoryStrategy::SharedPtr memory_strategy, rcl_guard_condition_t * executor_guard_condition) { // Empty initialize executable list @@ -80,6 +80,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 772cd8e260..b2f87ff839 100644 --- a/rclcpp/src/rclcpp/executors/static_single_threaded_executor.cpp +++ b/rclcpp/src/rclcpp/executors/static_single_threaded_executor.cpp @@ -48,6 +48,8 @@ StaticSingleThreadedExecutor::spin() entities_collector_->refresh_wait_set(); execute_ready_executables(); } + + entities_collector_->fini(); } void diff --git a/rclcpp/test/rclcpp/executors/test_executors.cpp b/rclcpp/test/rclcpp/executors/test_executors.cpp index f2493f4f2a..120882cb18 100644 --- a/rclcpp/test/rclcpp/executors/test_executors.cpp +++ b/rclcpp/test/rclcpp/executors/test_executors.cpp @@ -410,6 +410,14 @@ class TestWaitable : public rclcpp::Waitable } } + ~TestWaitable() + { + rcl_ret_t ret = rcl_guard_condition_fini(&gc_); + if (RCL_RET_OK != ret) { + rclcpp::exceptions::throw_from_rcl_error(ret); + } + } + bool add_to_wait_set(rcl_wait_set_t * wait_set) override { From 5b19c63a1e2683f1160181e3008aca60ee90d34c Mon Sep 17 00:00:00 2001 From: Chen Lihui Date: Mon, 14 Sep 2020 08:07:06 +0800 Subject: [PATCH 2/6] Call fini to avoid memory leak Signed-off-by: Chen Lihui --- .../executors/test_static_executor_entities_collector.cpp | 3 +++ 1 file changed, 3 insertions(+) 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 01b0082e5b..397eb81b70 100644 --- a/rclcpp/test/rclcpp/executors/test_static_executor_entities_collector.cpp +++ b/rclcpp/test/rclcpp/executors/test_static_executor_entities_collector.cpp @@ -190,6 +190,7 @@ TEST_F(TestStaticExecutorEntitiesCollector, add_remove_basic_node) { // Still one for the executor EXPECT_EQ(1u, entities_collector_->get_number_of_waitables()); + entities_collector_->fini(); } TEST_F(TestStaticExecutorEntitiesCollector, add_remove_node_out_of_scope) { @@ -224,6 +225,7 @@ TEST_F(TestStaticExecutorEntitiesCollector, add_remove_node_out_of_scope) { // Still one for the executor EXPECT_EQ(1u, entities_collector_->get_number_of_waitables()); + entities_collector_->fini(); } class TestWaitable : public rclcpp::Waitable @@ -303,6 +305,7 @@ TEST_F(TestStaticExecutorEntitiesCollector, add_remove_node_with_entities) { EXPECT_EQ(0u, entities_collector_->get_number_of_clients()); // Still one for the executor EXPECT_EQ(1u, entities_collector_->get_number_of_waitables()); + entities_collector_->fini(); } TEST_F(TestStaticExecutorEntitiesCollector, add_callback_group) { From d671b937e9c836e5e8e9e7ae98220b6e27455aa4 Mon Sep 17 00:00:00 2001 From: Chen Lihui Date: Sat, 10 Oct 2020 17:10:05 +0800 Subject: [PATCH 3/6] Call fini for new test cases after rebasing branch Signed-off-by: Chen Lihui --- .../executors/test_static_executor_entities_collector.cpp | 7 +++++++ 1 file changed, 7 insertions(+) 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 397eb81b70..1ab2c14b47 100644 --- a/rclcpp/test/rclcpp/executors/test_static_executor_entities_collector.cpp +++ b/rclcpp/test/rclcpp/executors/test_static_executor_entities_collector.cpp @@ -369,6 +369,7 @@ TEST_F(TestStaticExecutorEntitiesCollector, prepare_wait_set_rcl_wait_set_clear_ EXPECT_TRUE(entities_collector_->remove_node(node->get_node_base_interface())); entities_collector_->init(&wait_set, memory_strategy, &rcl_guard_condition); + entities_collector_->fini(); } TEST_F(TestStaticExecutorEntitiesCollector, prepare_wait_set_rcl_wait_set_resize_error) { @@ -399,6 +400,7 @@ TEST_F(TestStaticExecutorEntitiesCollector, prepare_wait_set_rcl_wait_set_resize EXPECT_TRUE(entities_collector_->remove_node(node->get_node_base_interface())); entities_collector_->init(&wait_set, memory_strategy, &rcl_guard_condition); + entities_collector_->fini(); } TEST_F(TestStaticExecutorEntitiesCollector, refresh_wait_set_not_initialized) { @@ -436,6 +438,7 @@ TEST_F(TestStaticExecutorEntitiesCollector, refresh_wait_set_rcl_wait_failed) { EXPECT_TRUE(entities_collector_->remove_node(node->get_node_base_interface())); entities_collector_->init(&wait_set, memory_strategy, &rcl_guard_condition); + entities_collector_->fini(); } TEST_F(TestStaticExecutorEntitiesCollector, refresh_wait_set_add_handles_to_wait_set_failed) { @@ -487,6 +490,7 @@ TEST_F(TestStaticExecutorEntitiesCollector, refresh_wait_set_add_handles_to_wait entities_collector_->remove_node(node->get_node_base_interface()); entities_collector_->init(&wait_set, memory_strategy, &rcl_guard_condition); + entities_collector_->fini(); } TEST_F(TestStaticExecutorEntitiesCollector, add_to_wait_set_nullptr) { @@ -515,6 +519,7 @@ TEST_F(TestStaticExecutorEntitiesCollector, add_to_wait_set_nullptr) { EXPECT_TRUE(entities_collector_->remove_node(node->get_node_base_interface())); entities_collector_->init(&wait_set, memory_strategy, &rcl_guard_condition); + entities_collector_->fini(); } TEST_F(TestStaticExecutorEntitiesCollector, fill_memory_strategy_invalid_group) { @@ -547,6 +552,7 @@ TEST_F(TestStaticExecutorEntitiesCollector, fill_memory_strategy_invalid_group) EXPECT_TRUE(entities_collector_->remove_node(node->get_node_base_interface())); entities_collector_->init(&wait_set, memory_strategy, &rcl_guard_condition); + entities_collector_->fini(); } TEST_F(TestStaticExecutorEntitiesCollector, remove_callback_group_after_node) { @@ -619,4 +625,5 @@ TEST_F( EXPECT_TRUE(entities_collector_->remove_node(node->get_node_base_interface())); entities_collector_->init(&wait_set, memory_strategy, &rcl_guard_condition); + entities_collector_->fini(); } From 61023d17dc1bc80d35ecb5ae52b0a3e61b5e5aea Mon Sep 17 00:00:00 2001 From: Chen Lihui Date: Sat, 10 Oct 2020 17:32:54 +0800 Subject: [PATCH 4/6] Use print error message to instead of throwing exception at destructor Signed-off-by: Chen Lihui --- rclcpp/test/rclcpp/executors/test_executors.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rclcpp/test/rclcpp/executors/test_executors.cpp b/rclcpp/test/rclcpp/executors/test_executors.cpp index 120882cb18..fa85dc94ba 100644 --- a/rclcpp/test/rclcpp/executors/test_executors.cpp +++ b/rclcpp/test/rclcpp/executors/test_executors.cpp @@ -414,7 +414,7 @@ class TestWaitable : public rclcpp::Waitable { rcl_ret_t ret = rcl_guard_condition_fini(&gc_); if (RCL_RET_OK != ret) { - rclcpp::exceptions::throw_from_rcl_error(ret); + fprintf(stderr, "failed to call rcl_guard_condition_fini\n"); } } From 9f3552cbeffcefabb9074a526ca795ef2813bdfd Mon Sep 17 00:00:00 2001 From: Chris Lalancette Date: Tue, 13 Oct 2020 15:11:15 +0000 Subject: [PATCH 5/6] Remove unnecessary test cleanups. Now that we have fini(), we don't need to "cleanup" using init() anymore. Signed-off-by: Chris Lalancette --- .../executors/test_static_executor_entities_collector.cpp | 7 ------- 1 file changed, 7 deletions(-) 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 1ab2c14b47..7f77e44fae 100644 --- a/rclcpp/test/rclcpp/executors/test_static_executor_entities_collector.cpp +++ b/rclcpp/test/rclcpp/executors/test_static_executor_entities_collector.cpp @@ -368,7 +368,6 @@ TEST_F(TestStaticExecutorEntitiesCollector, prepare_wait_set_rcl_wait_set_clear_ } EXPECT_TRUE(entities_collector_->remove_node(node->get_node_base_interface())); - entities_collector_->init(&wait_set, memory_strategy, &rcl_guard_condition); entities_collector_->fini(); } @@ -399,7 +398,6 @@ TEST_F(TestStaticExecutorEntitiesCollector, prepare_wait_set_rcl_wait_set_resize } EXPECT_TRUE(entities_collector_->remove_node(node->get_node_base_interface())); - entities_collector_->init(&wait_set, memory_strategy, &rcl_guard_condition); entities_collector_->fini(); } @@ -437,7 +435,6 @@ TEST_F(TestStaticExecutorEntitiesCollector, refresh_wait_set_rcl_wait_failed) { } EXPECT_TRUE(entities_collector_->remove_node(node->get_node_base_interface())); - entities_collector_->init(&wait_set, memory_strategy, &rcl_guard_condition); entities_collector_->fini(); } @@ -489,7 +486,6 @@ TEST_F(TestStaticExecutorEntitiesCollector, refresh_wait_set_add_handles_to_wait } entities_collector_->remove_node(node->get_node_base_interface()); - entities_collector_->init(&wait_set, memory_strategy, &rcl_guard_condition); entities_collector_->fini(); } @@ -518,7 +514,6 @@ TEST_F(TestStaticExecutorEntitiesCollector, add_to_wait_set_nullptr) { rcl_reset_error(); EXPECT_TRUE(entities_collector_->remove_node(node->get_node_base_interface())); - entities_collector_->init(&wait_set, memory_strategy, &rcl_guard_condition); entities_collector_->fini(); } @@ -551,7 +546,6 @@ TEST_F(TestStaticExecutorEntitiesCollector, fill_memory_strategy_invalid_group) ASSERT_EQ(entities_collector_->get_all_callback_groups().size(), 1u); EXPECT_TRUE(entities_collector_->remove_node(node->get_node_base_interface())); - entities_collector_->init(&wait_set, memory_strategy, &rcl_guard_condition); entities_collector_->fini(); } @@ -624,6 +618,5 @@ TEST_F( entities_collector_->execute(); EXPECT_TRUE(entities_collector_->remove_node(node->get_node_base_interface())); - entities_collector_->init(&wait_set, memory_strategy, &rcl_guard_condition); entities_collector_->fini(); } From cc17f6014c80a678160ae07a7da6823e4be36f8f Mon Sep 17 00:00:00 2001 From: Chen Lihui Date: Thu, 15 Oct 2020 13:57:51 +0800 Subject: [PATCH 6/6] use scope exit to call fini Signed-off-by: Chen Lihui --- .../static_single_threaded_executor.hpp | 12 ++++------- .../static_single_threaded_executor.cpp | 3 +-- ...est_static_executor_entities_collector.cpp | 20 +++++++++---------- 3 files changed, 15 insertions(+), 20 deletions(-) diff --git a/rclcpp/include/rclcpp/executors/static_single_threaded_executor.hpp b/rclcpp/include/rclcpp/executors/static_single_threaded_executor.hpp index a785f81497..cbfcd00a1c 100644 --- a/rclcpp/include/rclcpp/executors/static_single_threaded_executor.hpp +++ b/rclcpp/include/rclcpp/executors/static_single_threaded_executor.hpp @@ -193,8 +193,8 @@ 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()); - rclcpp::FutureReturnCode ret = rclcpp::FutureReturnCode::INTERRUPTED; while (rclcpp::ok(this->context_)) { // Do one set of work. entities_collector_->refresh_wait_set(timeout_left); @@ -202,8 +202,7 @@ class StaticSingleThreadedExecutor : public rclcpp::Executor // Check if the future is set, return SUCCESS if it is. status = future.wait_for(std::chrono::seconds(0)); if (status == std::future_status::ready) { - ret = rclcpp::FutureReturnCode::SUCCESS; - break; + return rclcpp::FutureReturnCode::SUCCESS; } // If the original timeout is < 0, then this is blocking, never TIMEOUT. if (timeout_ns < std::chrono::nanoseconds::zero()) { @@ -212,17 +211,14 @@ class StaticSingleThreadedExecutor : public rclcpp::Executor // Otherwise check if we still have time to wait, return TIMEOUT if not. auto now = std::chrono::steady_clock::now(); if (now >= end_time) { - ret = rclcpp::FutureReturnCode::TIMEOUT; - break; + return rclcpp::FutureReturnCode::TIMEOUT; } // Subtract the elapsed time from the original timeout. timeout_left = std::chrono::duration_cast(end_time - now); } - entities_collector_->fini(); - // The future did not complete before ok() returned false, return INTERRUPTED. - return ret; + return rclcpp::FutureReturnCode::INTERRUPTED; } /// Not yet implemented, see https://github.com/ros2/rclcpp/issues/1219 for tracking diff --git a/rclcpp/src/rclcpp/executors/static_single_threaded_executor.cpp b/rclcpp/src/rclcpp/executors/static_single_threaded_executor.cpp index b2f87ff839..7f018a51ce 100644 --- a/rclcpp/src/rclcpp/executors/static_single_threaded_executor.cpp +++ b/rclcpp/src/rclcpp/executors/static_single_threaded_executor.cpp @@ -42,14 +42,13 @@ 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 entities_collector_->refresh_wait_set(); execute_ready_executables(); } - - entities_collector_->fini(); } void 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 7f77e44fae..9947ad8d95 100644 --- a/rclcpp/test/rclcpp/executors/test_static_executor_entities_collector.cpp +++ b/rclcpp/test/rclcpp/executors/test_static_executor_entities_collector.cpp @@ -170,6 +170,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()); @@ -190,7 +191,6 @@ TEST_F(TestStaticExecutorEntitiesCollector, add_remove_basic_node) { // Still one for the executor EXPECT_EQ(1u, entities_collector_->get_number_of_waitables()); - entities_collector_->fini(); } TEST_F(TestStaticExecutorEntitiesCollector, add_remove_node_out_of_scope) { @@ -218,6 +218,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()); @@ -225,7 +226,6 @@ TEST_F(TestStaticExecutorEntitiesCollector, add_remove_node_out_of_scope) { // Still one for the executor EXPECT_EQ(1u, entities_collector_->get_number_of_waitables()); - entities_collector_->fini(); } class TestWaitable : public rclcpp::Waitable @@ -280,6 +280,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, @@ -305,7 +306,6 @@ TEST_F(TestStaticExecutorEntitiesCollector, add_remove_node_with_entities) { EXPECT_EQ(0u, entities_collector_->get_number_of_clients()); // Still one for the executor EXPECT_EQ(1u, entities_collector_->get_number_of_waitables()); - entities_collector_->fini(); } TEST_F(TestStaticExecutorEntitiesCollector, add_callback_group) { @@ -359,6 +359,7 @@ TEST_F(TestStaticExecutorEntitiesCollector, prepare_wait_set_rcl_wait_set_clear_ 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()); { auto mock = mocking_utils::patch_and_return("lib:rclcpp", rcl_wait_set_clear, RCL_RET_ERROR); @@ -368,7 +369,6 @@ TEST_F(TestStaticExecutorEntitiesCollector, prepare_wait_set_rcl_wait_set_clear_ } EXPECT_TRUE(entities_collector_->remove_node(node->get_node_base_interface())); - entities_collector_->fini(); } TEST_F(TestStaticExecutorEntitiesCollector, prepare_wait_set_rcl_wait_set_resize_error) { @@ -389,6 +389,7 @@ TEST_F(TestStaticExecutorEntitiesCollector, prepare_wait_set_rcl_wait_set_resize 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()); { auto mock = mocking_utils::patch_and_return("lib:rclcpp", rcl_wait_set_resize, RCL_RET_ERROR); @@ -398,7 +399,6 @@ TEST_F(TestStaticExecutorEntitiesCollector, prepare_wait_set_rcl_wait_set_resize } EXPECT_TRUE(entities_collector_->remove_node(node->get_node_base_interface())); - entities_collector_->fini(); } TEST_F(TestStaticExecutorEntitiesCollector, refresh_wait_set_not_initialized) { @@ -426,6 +426,7 @@ TEST_F(TestStaticExecutorEntitiesCollector, refresh_wait_set_rcl_wait_failed) { 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()); { auto mock = mocking_utils::patch_and_return("lib:rclcpp", rcl_wait, RCL_RET_ERROR); @@ -435,7 +436,6 @@ TEST_F(TestStaticExecutorEntitiesCollector, refresh_wait_set_rcl_wait_failed) { } EXPECT_TRUE(entities_collector_->remove_node(node->get_node_base_interface())); - entities_collector_->fini(); } TEST_F(TestStaticExecutorEntitiesCollector, refresh_wait_set_add_handles_to_wait_set_failed) { @@ -475,6 +475,7 @@ TEST_F(TestStaticExecutorEntitiesCollector, refresh_wait_set_add_handles_to_wait 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()); { auto mock = mocking_utils::patch_and_return( @@ -486,7 +487,6 @@ TEST_F(TestStaticExecutorEntitiesCollector, refresh_wait_set_add_handles_to_wait } entities_collector_->remove_node(node->get_node_base_interface()); - entities_collector_->fini(); } TEST_F(TestStaticExecutorEntitiesCollector, add_to_wait_set_nullptr) { @@ -507,6 +507,7 @@ TEST_F(TestStaticExecutorEntitiesCollector, add_to_wait_set_nullptr) { 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()); RCLCPP_EXPECT_THROW_EQ( entities_collector_->add_to_wait_set(nullptr), @@ -514,7 +515,6 @@ TEST_F(TestStaticExecutorEntitiesCollector, add_to_wait_set_nullptr) { rcl_reset_error(); EXPECT_TRUE(entities_collector_->remove_node(node->get_node_base_interface())); - entities_collector_->fini(); } TEST_F(TestStaticExecutorEntitiesCollector, fill_memory_strategy_invalid_group) { @@ -543,10 +543,10 @@ TEST_F(TestStaticExecutorEntitiesCollector, fill_memory_strategy_invalid_group) cb_group.reset(); entities_collector_->init(&wait_set, memory_strategy, &rcl_guard_condition); + RCLCPP_SCOPE_EXIT(entities_collector_->fini()); ASSERT_EQ(entities_collector_->get_all_callback_groups().size(), 1u); EXPECT_TRUE(entities_collector_->remove_node(node->get_node_base_interface())); - entities_collector_->fini(); } TEST_F(TestStaticExecutorEntitiesCollector, remove_callback_group_after_node) { @@ -613,10 +613,10 @@ TEST_F( 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()); cb_group->get_associated_with_executor_atomic().exchange(false); entities_collector_->execute(); EXPECT_TRUE(entities_collector_->remove_node(node->get_node_base_interface())); - entities_collector_->fini(); }