diff options
author | TreeHugger Robot <treehugger-gerrit@google.com> | 2019-09-11 02:31:02 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2019-09-11 02:31:02 +0000 |
commit | d4473d4ed29d61a1134a21e0523c3fb0eac100be (patch) | |
tree | 714e702b9fef8c8382f6255c2df34775be58c252 | |
parent | 5ebddd62966d38a4aa371783190e4d10519c09bf (diff) | |
parent | 23c90c87fd0804bfc98da07e242d27c925a2cfc8 (diff) | |
download | av-d4473d4ed29d61a1134a21e0523c3fb0eac100be.tar.gz |
Merge "Codec2: Retry interface creation until successful" into qt-qpr1-dev
-rw-r--r-- | media/codec2/hidl/client/client.cpp | 108 | ||||
-rw-r--r-- | media/codec2/hidl/client/include/codec2/hidl/client.h | 12 |
2 files changed, 65 insertions, 55 deletions
diff --git a/media/codec2/hidl/client/client.cpp b/media/codec2/hidl/client/client.cpp index 5ed54f1a24..c620badfab 100644 --- a/media/codec2/hidl/client/client.cpp +++ b/media/codec2/hidl/client/client.cpp @@ -883,66 +883,72 @@ std::shared_ptr<Codec2Client::Component> Codec2Client::CreateComponentByName( const char* componentName, const std::shared_ptr<Listener>& listener, - std::shared_ptr<Codec2Client>* owner) { - std::shared_ptr<Component> component; - c2_status_t status = ForAllServices( - componentName, - [owner, &component, componentName, &listener]( - const std::shared_ptr<Codec2Client> &client) - -> c2_status_t { - c2_status_t status = client->createComponent(componentName, - listener, - &component); - if (status == C2_OK) { - if (owner) { - *owner = client; + std::shared_ptr<Codec2Client>* owner, + size_t numberOfAttempts) { + while (true) { + std::shared_ptr<Component> component; + c2_status_t status = ForAllServices( + componentName, + [owner, &component, componentName, &listener]( + const std::shared_ptr<Codec2Client> &client) + -> c2_status_t { + c2_status_t status = client->createComponent(componentName, + listener, + &component); + if (status == C2_OK) { + if (owner) { + *owner = client; + } + } else if (status != C2_NOT_FOUND) { + LOG(DEBUG) << "IComponentStore(" + << client->getServiceName() + << ")::createComponent(\"" << componentName + << "\") returned status = " + << status << "."; } - } else if (status != C2_NOT_FOUND) { - LOG(DEBUG) << "IComponentStore(" - << client->getServiceName() - << ")::createComponent(\"" << componentName - << "\") returned status = " - << status << "."; - } - return status; - }); - if (status != C2_OK) { - LOG(DEBUG) << "Could not create component \"" << componentName << "\". " - "Status = " << status << "."; + return status; + }); + if (numberOfAttempts > 0 && status == C2_TRANSACTION_FAILED) { + --numberOfAttempts; + continue; + } + return component; } - return component; } std::shared_ptr<Codec2Client::Interface> Codec2Client::CreateInterfaceByName( const char* interfaceName, - std::shared_ptr<Codec2Client>* owner) { - std::shared_ptr<Interface> interface; - c2_status_t status = ForAllServices( - interfaceName, - [owner, &interface, interfaceName]( - const std::shared_ptr<Codec2Client> &client) - -> c2_status_t { - c2_status_t status = client->createInterface(interfaceName, - &interface); - if (status == C2_OK) { - if (owner) { - *owner = client; + std::shared_ptr<Codec2Client>* owner, + size_t numberOfAttempts) { + while (true) { + std::shared_ptr<Interface> interface; + c2_status_t status = ForAllServices( + interfaceName, + [owner, &interface, interfaceName]( + const std::shared_ptr<Codec2Client> &client) + -> c2_status_t { + c2_status_t status = client->createInterface(interfaceName, + &interface); + if (status == C2_OK) { + if (owner) { + *owner = client; + } + } else if (status != C2_NOT_FOUND) { + LOG(DEBUG) << "IComponentStore(" + << client->getServiceName() + << ")::createInterface(\"" << interfaceName + << "\") returned status = " + << status << "."; } - } else if (status != C2_NOT_FOUND) { - LOG(DEBUG) << "IComponentStore(" - << client->getServiceName() - << ")::createInterface(\"" << interfaceName - << "\") returned status = " - << status << "."; - } - return status; - }); - if (status != C2_OK) { - LOG(DEBUG) << "Could not create interface \"" << interfaceName << "\". " - "Status = " << status << "."; + return status; + }); + if (numberOfAttempts > 0 && status == C2_TRANSACTION_FAILED) { + --numberOfAttempts; + continue; + } + return interface; } - return interface; } std::vector<C2Component::Traits> const& Codec2Client::ListComponents() { diff --git a/media/codec2/hidl/client/include/codec2/hidl/client.h b/media/codec2/hidl/client/include/codec2/hidl/client.h index b8a7fb5d5b..848901d07f 100644 --- a/media/codec2/hidl/client/include/codec2/hidl/client.h +++ b/media/codec2/hidl/client/include/codec2/hidl/client.h @@ -179,17 +179,21 @@ struct Codec2Client : public Codec2ConfigurableClient { static std::vector<std::shared_ptr<Codec2Client>> CreateFromAllServices(); // Try to create a component with a given name from all known - // IComponentStore services. + // IComponentStore services. numberOfAttempts determines the number of times + // to retry the HIDL call if the transaction fails. static std::shared_ptr<Component> CreateComponentByName( char const* componentName, std::shared_ptr<Listener> const& listener, - std::shared_ptr<Codec2Client>* owner = nullptr); + std::shared_ptr<Codec2Client>* owner = nullptr, + size_t numberOfAttempts = 10); // Try to create a component interface with a given name from all known - // IComponentStore services. + // IComponentStore services. numberOfAttempts determines the number of times + // to retry the HIDL call if the transaction fails. static std::shared_ptr<Interface> CreateInterfaceByName( char const* interfaceName, - std::shared_ptr<Codec2Client>* owner = nullptr); + std::shared_ptr<Codec2Client>* owner = nullptr, + size_t numberOfAttempts = 10); // List traits from all known IComponentStore services. static std::vector<C2Component::Traits> const& ListComponents(); |