diff --git a/automotive/vehicle/aidl/impl/grpc/GRPCVehicleProxyServer.cpp b/automotive/vehicle/aidl/impl/grpc/GRPCVehicleProxyServer.cpp index eb98af04fe..d7cbe1b017 100644 --- a/automotive/vehicle/aidl/impl/grpc/GRPCVehicleProxyServer.cpp +++ b/automotive/vehicle/aidl/impl/grpc/GRPCVehicleProxyServer.cpp @@ -69,10 +69,13 @@ GrpcVehicleProxyServer::GrpcVehicleProxyServer(std::vector serverAd const proto::VehiclePropValueRequests* requests, proto::SetValueResults* results) { std::vector aidlRequests; + std::unordered_set requestIds; for (const auto& protoRequest : requests->requests()) { auto& aidlRequest = aidlRequests.emplace_back(); - aidlRequest.requestId = protoRequest.request_id(); + int64_t requestId = protoRequest.request_id(); + aidlRequest.requestId = requestId; proto_msg_converter::protoToAidl(protoRequest.value(), &aidlRequest.value); + requestIds.insert(requestId); } auto waitMtx = std::make_shared(); auto waitCV = std::make_shared(); @@ -80,19 +83,27 @@ GrpcVehicleProxyServer::GrpcVehicleProxyServer(std::vector serverAd auto tmpResults = std::make_shared(); auto aidlStatus = mHardware->setValues( std::make_shared( - [waitMtx, waitCV, complete, - tmpResults](std::vector setValueResults) { - for (const auto& aidlResult : setValueResults) { - auto& protoResult = *tmpResults->add_results(); - protoResult.set_request_id(aidlResult.requestId); - protoResult.set_status( - static_cast(aidlResult.status)); - } + [waitMtx, waitCV, complete, tmpResults, + &requestIds](std::vector setValueResults) { + bool receivedAllResults = false; { std::lock_guard lck(*waitMtx); - *complete = true; + for (const auto& aidlResult : setValueResults) { + auto& protoResult = *tmpResults->add_results(); + int64_t requestIdForResult = aidlResult.requestId; + protoResult.set_request_id(requestIdForResult); + protoResult.set_status( + static_cast(aidlResult.status)); + requestIds.erase(requestIdForResult); + } + if (requestIds.empty()) { + receivedAllResults = true; + *complete = true; + } + } + if (receivedAllResults) { + waitCV->notify_all(); } - waitCV->notify_all(); }), aidlRequests); if (aidlStatus != aidlvhal::StatusCode::OK) { @@ -114,10 +125,13 @@ GrpcVehicleProxyServer::GrpcVehicleProxyServer(std::vector serverAd const proto::VehiclePropValueRequests* requests, proto::GetValueResults* results) { std::vector aidlRequests; + std::unordered_set requestIds; for (const auto& protoRequest : requests->requests()) { auto& aidlRequest = aidlRequests.emplace_back(); - aidlRequest.requestId = protoRequest.request_id(); + int64_t requestId = protoRequest.request_id(); + aidlRequest.requestId = requestId; proto_msg_converter::protoToAidl(protoRequest.value(), &aidlRequest.prop); + requestIds.insert(requestId); } auto waitMtx = std::make_shared(); auto waitCV = std::make_shared(); @@ -125,23 +139,31 @@ GrpcVehicleProxyServer::GrpcVehicleProxyServer(std::vector serverAd auto tmpResults = std::make_shared(); auto aidlStatus = mHardware->getValues( std::make_shared( - [waitMtx, waitCV, complete, - tmpResults](std::vector getValueResults) { - for (const auto& aidlResult : getValueResults) { - auto& protoResult = *tmpResults->add_results(); - protoResult.set_request_id(aidlResult.requestId); - protoResult.set_status( - static_cast(aidlResult.status)); - if (aidlResult.prop) { - auto* valuePtr = protoResult.mutable_value(); - proto_msg_converter::aidlToProto(*aidlResult.prop, valuePtr); - } - } + [waitMtx, waitCV, complete, tmpResults, + &requestIds](std::vector getValueResults) { + bool receivedAllResults = false; { std::lock_guard lck(*waitMtx); - *complete = true; + for (const auto& aidlResult : getValueResults) { + auto& protoResult = *tmpResults->add_results(); + int64_t requestIdForResult = aidlResult.requestId; + protoResult.set_request_id(requestIdForResult); + protoResult.set_status( + static_cast(aidlResult.status)); + if (aidlResult.prop) { + auto* valuePtr = protoResult.mutable_value(); + proto_msg_converter::aidlToProto(*aidlResult.prop, valuePtr); + } + requestIds.erase(requestIdForResult); + } + if (requestIds.empty()) { + receivedAllResults = true; + *complete = true; + } + } + if (receivedAllResults) { + waitCV->notify_all(); } - waitCV->notify_all(); }), aidlRequests); if (aidlStatus != aidlvhal::StatusCode::OK) {