summaryrefslogtreecommitdiffstats
path: root/ServiceManager.cpp
diff options
context:
space:
mode:
authorMartijn Coenen <maco@google.com>2017-03-06 13:05:39 +0100
committerMartijn Coenen <maco@google.com>2017-03-08 11:49:10 +0100
commit1a5da1cf62832d45089b004e6050bd3d8d879e63 (patch)
tree7820baa21cae524b18e193995fee7c407ca37275 /ServiceManager.cpp
parent74085eaaf0c30b10aae605dd4ee97d3afd560bb0 (diff)
downloadplatform_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.cpp56
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) {