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

Commit 66bf7752 authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

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

parents 82805fe0 deb05c99
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) {