fix: adjust context handling in ROS2 adapter RPC client and server (#138)

* fix: adjust context handling in ROS2 adapter RPC client and server

- Updated the context reservation in `ros2_adapter_rpc_client.cc` to accommodate an additional timeout value.
- Modified the context parsing in `ros2_adapter_rpc_server.cc` to correctly handle the new timeout value and adjust the indexing for key-value pairs accordingly.

* fix: enhance context handling for timeout in ROS2 adapter RPC client and server

- Updated context reservation in `ros2_adapter_rpc_client.cc` to include an additional timeout entry.
- Adjusted context parsing in `ros2_adapter_rpc_server.cc` to correctly set the timeout and handle key-value pairs more efficiently.
This commit is contained in:
zhangyi1357 2024-12-26 16:11:41 +08:00 committed by GitHub
parent 413ef3eb65
commit 6b3e1ac4a7
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 10 additions and 5 deletions

View File

@ -245,7 +245,9 @@ void Ros2AdapterWrapperClient::Invoke(
wrapper_req.serialization_type = serialization_type;
const auto& keys = client_invoke_wrapper_ptr->ctx_ref.GetMetaKeys();
wrapper_req.context.reserve(2 * keys.size());
wrapper_req.context.reserve(2 * (keys.size() + 1));
wrapper_req.context.emplace_back("aimrt-timeout");
wrapper_req.context.emplace_back(std::to_string(client_invoke_wrapper_ptr->ctx_ref.Timeout().count()));
for (const auto& key : keys) {
wrapper_req.context.emplace_back(key);
wrapper_req.context.emplace_back(client_invoke_wrapper_ptr->ctx_ref.GetMetaValue(key));

View File

@ -204,10 +204,13 @@ void Ros2AdapterWrapperServer::handle_request(
// 获取字段
auto& wrapper_req = *(static_cast<ros2_plugin_proto::srv::RosRpcWrapper::Request*>(request.get()));
size_t context_size = wrapper_req.context.size() / 2;
for (size_t ii = 0; ii < context_size; ++ii) {
const auto& key = wrapper_req.context[ii * 2];
const auto& val = wrapper_req.context[ii * 2 + 1];
for (size_t ii = 0; ii + 1 < wrapper_req.context.size(); ii += 2) {
const auto& key = wrapper_req.context[ii];
const auto& val = wrapper_req.context[ii + 1];
if (ii == 0 && key == "aimrt-timeout") {
ctx_ptr->SetTimeout(std::chrono::nanoseconds(std::stoll(val)));
continue;
}
ctx_ptr->SetMetaValue(key, val);
}