From 0c3d50bab382b469b3fd29a4d1291cec616503de Mon Sep 17 00:00:00 2001 From: mbryan Date: Wed, 18 Jan 2023 15:55:54 +0700 Subject: [PATCH] Ensure planner_server shuts down cleanly on SIGINT. Needed to ensure code coverage flushes. See Issue #3271. Signed-off-by: mbryan --- nav2_planner/src/planner_server.cpp | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/nav2_planner/src/planner_server.cpp b/nav2_planner/src/planner_server.cpp index f58bdac31fd..419de19d783 100644 --- a/nav2_planner/src/planner_server.cpp +++ b/nav2_planner/src/planner_server.cpp @@ -25,6 +25,7 @@ #include #include "builtin_interfaces/msg/duration.hpp" +#include "lifecycle_msgs/msg/state.hpp" #include "nav2_util/costmap.hpp" #include "nav2_util/node_utils.hpp" #include "nav2_util/geometry_utils.hpp" @@ -69,6 +70,10 @@ PlannerServer::PlannerServer(const rclcpp::NodeOptions & options) PlannerServer::~PlannerServer() { + /* + * Backstop ensuring this state is destroyed, even if deactivate/cleanup are + * never called. + */ planners_.clear(); costmap_thread_.reset(); } @@ -194,7 +199,12 @@ PlannerServer::on_deactivate(const rclcpp_lifecycle::State & /*state*/) action_server_pose_->deactivate(); action_server_poses_->deactivate(); plan_publisher_->on_deactivate(); - costmap_ros_->deactivate(); + + if (costmap_ros_->get_current_state().id() == + lifecycle_msgs::msg::State::PRIMARY_STATE_ACTIVE) + { + costmap_ros_->deactivate(); + } PlannerMap::iterator it; for (it = planners_.begin(); it != planners_.end(); ++it) { @@ -218,13 +228,24 @@ PlannerServer::on_cleanup(const rclcpp_lifecycle::State & /*state*/) action_server_poses_.reset(); plan_publisher_.reset(); tf_.reset(); - costmap_ros_->cleanup(); + + /* + * Double check whether something else transitioned it to INACTIVE + * already, e.g. the rcl preshutdown callback. + */ + if (costmap_ros_->get_current_state().id() == + lifecycle_msgs::msg::State::PRIMARY_STATE_INACTIVE) + { + costmap_ros_->cleanup(); + } PlannerMap::iterator it; for (it = planners_.begin(); it != planners_.end(); ++it) { it->second->cleanup(); } + planners_.clear(); + costmap_thread_.reset(); costmap_ = nullptr; return nav2_util::CallbackReturn::SUCCESS; }