diff options
| author | Martijn Coenen <maco@google.com> | 2017-03-06 13:05:39 +0100 |
|---|---|---|
| committer | Martijn Coenen <maco@google.com> | 2017-03-08 11:49:10 +0100 |
| commit | 1a5da1cf62832d45089b004e6050bd3d8d879e63 (patch) | |
| tree | 7820baa21cae524b18e193995fee7c407ca37275 /ServiceManager.cpp | |
| parent | 74085eaaf0c30b10aae605dd4ee97d3afd560bb0 (diff) | |
| download | platform_system_hwservicemanager-1a5da1cf62832d45089b004e6050bd3d8d879e63.tar.gz platform_system_hwservicemanager-1a5da1cf62832d45089b004e6050bd3d8d879e63.tar.bz2 platform_system_hwservicemanager-1a5da1cf62832d45089b004e6050bd3d8d879e63.zip | |
Remove interfaceChain from IServiceManager::add()
Bug: 32742469
Test: hidl_test, binderized marlin boots
Change-Id: Ied6ed55ea12fc8c2bd576254a5bf5dda7e18dbf0
Diffstat (limited to 'ServiceManager.cpp')
| -rw-r--r-- | ServiceManager.cpp | 56 |
1 files changed, 34 insertions, 22 deletions
diff --git a/ServiceManager.cpp b/ServiceManager.cpp index e6ec17e..c90e81d 100644 --- a/ServiceManager.cpp +++ b/ServiceManager.cpp @@ -121,38 +121,50 @@ Return<sp<IBase>> ServiceManager::get(const hidl_string& fqName, return hidlService->getService(); } -Return<bool> ServiceManager::add(const hidl_vec<hidl_string>& interfaceChain, - const hidl_string& name, - const sp<IBase>& service) { +Return<bool> ServiceManager::add(const hidl_string& name, const sp<IBase>& service) { + bool isValidService = false; - if (interfaceChain.size() == 0 || service == nullptr) { + if (service == nullptr) { return false; } - for(size_t i = 0; i < interfaceChain.size(); i++) { - std::string fqName = interfaceChain[i]; - - PackageInterfaceMap &ifaceMap = mServiceMap[fqName]; - HidlService *hidlService = ifaceMap.lookup(name); + auto ret = service->interfaceChain([&](const auto &interfaceChain) { + if (interfaceChain.size() == 0) { + return; + } - if (hidlService == nullptr) { - ifaceMap.insertService( - std::make_unique<HidlService>(fqName, name, service)); - } else { - if (hidlService->getService() != nullptr) { - auto ret = hidlService->getService()->unlinkToDeath(this); - ret.isOk(); // ignore + for(size_t i = 0; i < interfaceChain.size(); i++) { + std::string fqName = interfaceChain[i]; + + PackageInterfaceMap &ifaceMap = mServiceMap[fqName]; + HidlService *hidlService = ifaceMap.lookup(name); + + if (hidlService == nullptr) { + ifaceMap.insertService( + std::make_unique<HidlService>(fqName, name, service)); + } else { + if (hidlService->getService() != nullptr) { + auto ret = hidlService->getService()->unlinkToDeath(this); + ret.isOk(); // ignore + } + hidlService->setService(service); } - hidlService->setService(service); + + ifaceMap.sendPackageRegistrationNotification(fqName, name); } - ifaceMap.sendPackageRegistrationNotification(fqName, name); - } + auto linkRet = service->linkToDeath(this, 0 /*cookie*/); + linkRet.isOk(); // ignore - auto ret = service->linkToDeath(this, 0 /*cookie*/); - ret.isOk(); // ignore + isValidService = true; + }); - return true; + if (!ret.isOk()) { + LOG(ERROR) << "Failed to retrieve interface chain."; + return false; + } + + return isValidService; } Return<void> ServiceManager::list(list_cb _hidl_cb) { |
