Merge pull request #47 from ros2/broken-promise

Fix 'broken promise' error
This commit is contained in:
Esteve Fernandez 2015-06-25 15:55:55 -07:00
commit 8119064733
3 changed files with 45 additions and 34 deletions

View file

@ -368,7 +368,9 @@ Node::list_parameters(
// TODO(esteve): define parameter separator, use "." for now // TODO(esteve): define parameter separator, use "." for now
for (auto & kv : parameters_) { for (auto & kv : parameters_) {
if (std::any_of(prefixes.cbegin(), prefixes.cend(), [&kv, &depth](const std::string & prefix) { if (std::any_of(prefixes.cbegin(), prefixes.cend(), [&kv, &depth](const std::string & prefix) {
if (kv.first.find(prefix + ".") == 0) { if (kv.first == prefix) {
return true;
} else if (kv.first.find(prefix + ".") == 0) {
size_t length = prefix.length(); size_t length = prefix.length();
std::string substr = kv.first.substr(length); std::string substr = kv.first.substr(length);
// Cast as unsigned integer to avoid warning // Cast as unsigned integer to avoid warning
@ -379,11 +381,13 @@ Node::list_parameters(
{ {
result.names.push_back(kv.first); result.names.push_back(kv.first);
size_t last_separator = kv.first.find_last_of('.'); size_t last_separator = kv.first.find_last_of('.');
std::string prefix = kv.first.substr(0, last_separator); if (std::string::npos != last_separator) {
if (std::find(result.prefixes.cbegin(), result.prefixes.cend(), std::string prefix = kv.first.substr(0, last_separator);
prefix) == result.prefixes.cend()) if (std::find(result.prefixes.cbegin(), result.prefixes.cend(), prefix) ==
{ result.prefixes.cend())
result.prefixes.push_back(prefix); {
result.prefixes.push_back(prefix);
}
} }
} }
} }

View file

@ -73,28 +73,30 @@ public:
std::function<void( std::function<void(
std::shared_future<std::vector<rclcpp::parameter::ParameterVariant>>)> callback = nullptr) std::shared_future<std::vector<rclcpp::parameter::ParameterVariant>>)> callback = nullptr)
{ {
std::promise<std::vector<rclcpp::parameter::ParameterVariant>> promise_result; auto promise_result =
auto future_result = promise_result.get_future().share(); std::make_shared<std::promise<std::vector<rclcpp::parameter::ParameterVariant>>>();
auto future_result = promise_result->get_future().share();
auto request = std::make_shared<rcl_interfaces::srv::GetParameters::Request>(); auto request = std::make_shared<rcl_interfaces::srv::GetParameters::Request>();
request->names = names; request->names = names;
get_parameters_client_->async_send_request( get_parameters_client_->async_send_request(
request, request,
[&names, &promise_result, &future_result, &callback]( [request, promise_result, future_result, &callback](
rclcpp::client::Client<rcl_interfaces::srv::GetParameters>::SharedFuture cb_f) { rclcpp::client::Client<rcl_interfaces::srv::GetParameters>::SharedFuture cb_f) {
std::vector<rclcpp::parameter::ParameterVariant> parameter_variants; std::vector<rclcpp::parameter::ParameterVariant> parameter_variants;
auto & pvalues = cb_f.get()->values; auto & pvalues = cb_f.get()->values;
std::transform(pvalues.begin(), pvalues.end(), std::back_inserter(parameter_variants), for (auto & pvalue : pvalues) {
[&names, &pvalues](rcl_interfaces::msg::ParameterValue pvalue) {
auto i = &pvalue - &pvalues[0]; auto i = &pvalue - &pvalues[0];
rcl_interfaces::msg::Parameter parameter; rcl_interfaces::msg::Parameter parameter;
parameter.name = names[i]; parameter.name = request->names[i];
parameter.value = pvalue; parameter.value = pvalue;
return rclcpp::parameter::ParameterVariant::from_parameter(parameter); parameter_variants.push_back(rclcpp::parameter::ParameterVariant::from_parameter(
}); parameter));
promise_result.set_value(parameter_variants); }
promise_result->set_value(parameter_variants);
if (callback != nullptr) { if (callback != nullptr) {
callback(future_result); callback(future_result);
} }
@ -110,21 +112,23 @@ public:
std::function<void( std::function<void(
std::shared_future<std::vector<rclcpp::parameter::ParameterType>>)> callback = nullptr) std::shared_future<std::vector<rclcpp::parameter::ParameterType>>)> callback = nullptr)
{ {
std::promise<std::vector<rclcpp::parameter::ParameterType>> promise_result; auto promise_result =
auto future_result = promise_result.get_future().share(); std::make_shared<std::promise<std::vector<rclcpp::parameter::ParameterType>>>();
auto future_result = promise_result->get_future().share();
auto request = std::make_shared<rcl_interfaces::srv::GetParameterTypes::Request>(); auto request = std::make_shared<rcl_interfaces::srv::GetParameterTypes::Request>();
request->names = names; request->names = names;
get_parameter_types_client_->async_send_request( get_parameter_types_client_->async_send_request(
request, request,
[&promise_result, &future_result, &callback]( [promise_result, future_result, &callback](
rclcpp::client::Client<rcl_interfaces::srv::GetParameterTypes>::SharedFuture cb_f) { rclcpp::client::Client<rcl_interfaces::srv::GetParameterTypes>::SharedFuture cb_f) {
std::vector<rclcpp::parameter::ParameterType> types; std::vector<rclcpp::parameter::ParameterType> types;
auto & pts = cb_f.get()->types; auto & pts = cb_f.get()->types;
std::transform(pts.begin(), pts.end(), std::back_inserter(types), for (auto & pt : pts) {
[](uint8_t pt) {return static_cast<rclcpp::parameter::ParameterType>(pt); }); pts.push_back(static_cast<rclcpp::parameter::ParameterType>(pt));
promise_result.set_value(types); }
promise_result->set_value(types);
if (callback != nullptr) { if (callback != nullptr) {
callback(future_result); callback(future_result);
} }
@ -140,8 +144,9 @@ public:
std::function<void(std::shared_future<std::vector<rcl_interfaces::msg::SetParametersResult>>)> callback = std::function<void(std::shared_future<std::vector<rcl_interfaces::msg::SetParametersResult>>)> callback =
nullptr) nullptr)
{ {
std::promise<std::vector<rcl_interfaces::msg::SetParametersResult>> promise_result; auto promise_result =
auto future_result = promise_result.get_future().share(); std::make_shared<std::promise<std::vector<rcl_interfaces::msg::SetParametersResult>>>();
auto future_result = promise_result->get_future().share();
auto request = std::make_shared<rcl_interfaces::srv::SetParameters::Request>(); auto request = std::make_shared<rcl_interfaces::srv::SetParameters::Request>();
@ -151,9 +156,9 @@ public:
set_parameters_client_->async_send_request( set_parameters_client_->async_send_request(
request, request,
[&promise_result, &future_result, &callback]( [promise_result, future_result, &callback](
rclcpp::client::Client<rcl_interfaces::srv::SetParameters>::SharedFuture cb_f) { rclcpp::client::Client<rcl_interfaces::srv::SetParameters>::SharedFuture cb_f) {
promise_result.set_value(cb_f.get()->results); promise_result->set_value(cb_f.get()->results);
if (callback != nullptr) { if (callback != nullptr) {
callback(future_result); callback(future_result);
} }
@ -169,8 +174,9 @@ public:
std::function<void(std::shared_future<rcl_interfaces::msg::SetParametersResult>)> callback = std::function<void(std::shared_future<rcl_interfaces::msg::SetParametersResult>)> callback =
nullptr) nullptr)
{ {
std::promise<rcl_interfaces::msg::SetParametersResult> promise_result; auto promise_result =
auto future_result = promise_result.get_future().share(); std::make_shared<std::promise<rcl_interfaces::msg::SetParametersResult>>();
auto future_result = promise_result->get_future().share();
auto request = std::make_shared<rcl_interfaces::srv::SetParametersAtomically::Request>(); auto request = std::make_shared<rcl_interfaces::srv::SetParametersAtomically::Request>();
@ -180,9 +186,9 @@ public:
set_parameters_atomically_client_->async_send_request( set_parameters_atomically_client_->async_send_request(
request, request,
[&promise_result, &future_result, &callback]( [promise_result, future_result, &callback](
rclcpp::client::Client<rcl_interfaces::srv::SetParametersAtomically>::SharedFuture cb_f) { rclcpp::client::Client<rcl_interfaces::srv::SetParametersAtomically>::SharedFuture cb_f) {
promise_result.set_value(cb_f.get()->result); promise_result->set_value(cb_f.get()->result);
if (callback != nullptr) { if (callback != nullptr) {
callback(future_result); callback(future_result);
} }
@ -199,8 +205,9 @@ public:
std::function<void(std::shared_future<rcl_interfaces::msg::ListParametersResult>)> callback = std::function<void(std::shared_future<rcl_interfaces::msg::ListParametersResult>)> callback =
nullptr) nullptr)
{ {
std::promise<rcl_interfaces::msg::ListParametersResult> promise_result; auto promise_result =
auto future_result = promise_result.get_future().share(); std::make_shared<std::promise<rcl_interfaces::msg::ListParametersResult>>();
auto future_result = promise_result->get_future().share();
auto request = std::make_shared<rcl_interfaces::srv::ListParameters::Request>(); auto request = std::make_shared<rcl_interfaces::srv::ListParameters::Request>();
request->prefixes = prefixes; request->prefixes = prefixes;
@ -208,9 +215,9 @@ public:
list_parameters_client_->async_send_request( list_parameters_client_->async_send_request(
request, request,
[&promise_result, &future_result, &callback]( [promise_result, future_result, &callback](
rclcpp::client::Client<rcl_interfaces::srv::ListParameters>::SharedFuture cb_f) { rclcpp::client::Client<rcl_interfaces::srv::ListParameters>::SharedFuture cb_f) {
promise_result.set_value(cb_f.get()->result); promise_result->set_value(cb_f.get()->result);
if (callback != nullptr) { if (callback != nullptr) {
callback(future_result); callback(future_result);
} }

View file

@ -124,7 +124,7 @@ public:
); );
list_parameters_service_ = node_->create_service<rcl_interfaces::srv::ListParameters>( list_parameters_service_ = node_->create_service<rcl_interfaces::srv::ListParameters>(
node_->get_name() + "__describe_parameters", [&node]( node_->get_name() + "__list_parameters", [&node](
const std::shared_ptr<rmw_request_id_t> request_header, const std::shared_ptr<rmw_request_id_t> request_header,
const std::shared_ptr<rcl_interfaces::srv::ListParameters::Request> request, const std::shared_ptr<rcl_interfaces::srv::ListParameters::Request> request,
std::shared_ptr<rcl_interfaces::srv::ListParameters::Response> response) std::shared_ptr<rcl_interfaces::srv::ListParameters::Response> response)