Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit deb05c99 authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge "Wait for all results to come before return." into main

parents ca683988 b561e444
Loading
Loading
Loading
Loading
+48 −26
Original line number Diff line number Diff line
@@ -69,10 +69,13 @@ GrpcVehicleProxyServer::GrpcVehicleProxyServer(std::vector<std::string> serverAd
                                                 const proto::VehiclePropValueRequests* requests,
                                                 proto::SetValueResults* results) {
    std::vector<aidlvhal::SetValueRequest> aidlRequests;
    std::unordered_set<int64_t> 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<std::mutex>();
    auto waitCV = std::make_shared<std::condition_variable>();
@@ -80,19 +83,27 @@ GrpcVehicleProxyServer::GrpcVehicleProxyServer(std::vector<std::string> serverAd
    auto tmpResults = std::make_shared<proto::SetValueResults>();
    auto aidlStatus = mHardware->setValues(
            std::make_shared<const IVehicleHardware::SetValuesCallback>(
                    [waitMtx, waitCV, complete,
                     tmpResults](std::vector<aidlvhal::SetValueResult> setValueResults) {
                    [waitMtx, waitCV, complete, tmpResults,
                     &requestIds](std::vector<aidlvhal::SetValueResult> setValueResults) {
                        bool receivedAllResults = false;
                        {
                            std::lock_guard lck(*waitMtx);
                            for (const auto& aidlResult : setValueResults) {
                                auto& protoResult = *tmpResults->add_results();
                            protoResult.set_request_id(aidlResult.requestId);
                                int64_t requestIdForResult = aidlResult.requestId;
                                protoResult.set_request_id(requestIdForResult);
                                protoResult.set_status(
                                        static_cast<proto::StatusCode>(aidlResult.status));
                                requestIds.erase(requestIdForResult);
                            }
                        {
                            std::lock_guard lck(*waitMtx);
                            if (requestIds.empty()) {
                                receivedAllResults = true;
                                *complete = true;
                            }
                        }
                        if (receivedAllResults) {
                            waitCV->notify_all();
                        }
                    }),
            aidlRequests);
    if (aidlStatus != aidlvhal::StatusCode::OK) {
@@ -114,10 +125,13 @@ GrpcVehicleProxyServer::GrpcVehicleProxyServer(std::vector<std::string> serverAd
                                                 const proto::VehiclePropValueRequests* requests,
                                                 proto::GetValueResults* results) {
    std::vector<aidlvhal::GetValueRequest> aidlRequests;
    std::unordered_set<int64_t> 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<std::mutex>();
    auto waitCV = std::make_shared<std::condition_variable>();
@@ -125,23 +139,31 @@ GrpcVehicleProxyServer::GrpcVehicleProxyServer(std::vector<std::string> serverAd
    auto tmpResults = std::make_shared<proto::GetValueResults>();
    auto aidlStatus = mHardware->getValues(
            std::make_shared<const IVehicleHardware::GetValuesCallback>(
                    [waitMtx, waitCV, complete,
                     tmpResults](std::vector<aidlvhal::GetValueResult> getValueResults) {
                    [waitMtx, waitCV, complete, tmpResults,
                     &requestIds](std::vector<aidlvhal::GetValueResult> getValueResults) {
                        bool receivedAllResults = false;
                        {
                            std::lock_guard lck(*waitMtx);
                            for (const auto& aidlResult : getValueResults) {
                                auto& protoResult = *tmpResults->add_results();
                            protoResult.set_request_id(aidlResult.requestId);
                                int64_t requestIdForResult = aidlResult.requestId;
                                protoResult.set_request_id(requestIdForResult);
                                protoResult.set_status(
                                        static_cast<proto::StatusCode>(aidlResult.status));
                                if (aidlResult.prop) {
                                    auto* valuePtr = protoResult.mutable_value();
                                    proto_msg_converter::aidlToProto(*aidlResult.prop, valuePtr);
                                }
                                requestIds.erase(requestIdForResult);
                            }
                        {
                            std::lock_guard lck(*waitMtx);
                            if (requestIds.empty()) {
                                receivedAllResults = true;
                                *complete = true;
                            }
                        }
                        if (receivedAllResults) {
                            waitCV->notify_all();
                        }
                    }),
            aidlRequests);
    if (aidlStatus != aidlvhal::StatusCode::OK) {