From 808d54c6135f33941f61b4ad405e67b541eb6076 Mon Sep 17 00:00:00 2001 From: Esteve Fernandez Date: Wed, 21 Oct 2015 13:12:09 -0700 Subject: [PATCH] Pass weak pointer to callback --- rclcpp/include/rclcpp/parameter_service.hpp | 37 +++++++++++++++++---- 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/rclcpp/include/rclcpp/parameter_service.hpp b/rclcpp/include/rclcpp/parameter_service.hpp index 953c4c2..ffc2983 100644 --- a/rclcpp/include/rclcpp/parameter_service.hpp +++ b/rclcpp/include/rclcpp/parameter_service.hpp @@ -46,12 +46,17 @@ public: ParameterService(const rclcpp::node::Node::SharedPtr node) : node_(node) { + std::weak_ptr captured_node = node_; get_parameters_service_ = node_->create_service( - node_->get_name() + "__get_parameters", [node]( + node_->get_name() + "__get_parameters", [captured_node]( const std::shared_ptr, const std::shared_ptr request, std::shared_ptr response) { + auto node = captured_node.lock(); + if (!node) { + return; + } auto values = node->get_parameters(request->names); for (auto & pvariant : values) { response->values.push_back(pvariant.get_parameter_value()); @@ -60,11 +65,15 @@ public: ); get_parameter_types_service_ = node_->create_service( - node_->get_name() + "__get_parameter_types", [node]( + node_->get_name() + "__get_parameter_types", [captured_node]( const std::shared_ptr, const std::shared_ptr request, std::shared_ptr response) { + auto node = captured_node.lock(); + if (!node) { + return; + } auto types = node->get_parameter_types(request->names); std::transform(types.cbegin(), types.cend(), std::back_inserter(response->types), [](const uint8_t & type) { @@ -74,11 +83,15 @@ public: ); set_parameters_service_ = node_->create_service( - node_->get_name() + "__set_parameters", [node]( + node_->get_name() + "__set_parameters", [captured_node]( const std::shared_ptr, const std::shared_ptr request, std::shared_ptr response) { + auto node = captured_node.lock(); + if (!node) { + return; + } std::vector pvariants; for (auto & p : request->parameters) { pvariants.push_back(rclcpp::parameter::ParameterVariant::from_parameter(p)); @@ -90,11 +103,15 @@ public: set_parameters_atomically_service_ = node_->create_service( - node_->get_name() + "__set_parameters_atomically", [node]( + node_->get_name() + "__set_parameters_atomically", [captured_node]( const std::shared_ptr, const std::shared_ptr request, std::shared_ptr response) { + auto node = captured_node.lock(); + if (!node) { + return; + } std::vector pvariants; std::transform(request->parameters.cbegin(), request->parameters.cend(), std::back_inserter(pvariants), @@ -108,22 +125,30 @@ public: ); describe_parameters_service_ = node_->create_service( - node_->get_name() + "__describe_parameters", [node]( + node_->get_name() + "__describe_parameters", [captured_node]( const std::shared_ptr, const std::shared_ptr request, std::shared_ptr response) { + auto node = captured_node.lock(); + if (!node) { + return; + } auto descriptors = node->describe_parameters(request->names); response->descriptors = descriptors; } ); list_parameters_service_ = node_->create_service( - node_->get_name() + "__list_parameters", [node]( + node_->get_name() + "__list_parameters", [captured_node]( const std::shared_ptr, const std::shared_ptr request, std::shared_ptr response) { + auto node = captured_node.lock(); + if (!node) { + return; + } auto result = node->list_parameters(request->prefixes, request->depth); response->result = result; }