ServiceManagement.cpp revision 67a024919015598efa7e24f0ab3d0d9154f12523
15d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland/* 25d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland * Copyright (C) 2016 The Android Open Source Project 35d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland * 45d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland * Licensed under the Apache License, Version 2.0 (the "License"); 55d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland * you may not use this file except in compliance with the License. 65d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland * You may obtain a copy of the License at 75d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland * 85d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland * http://www.apache.org/licenses/LICENSE-2.0 95d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland * 105d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland * Unless required by applicable law or agreed to in writing, software 115d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland * distributed under the License is distributed on an "AS IS" BASIS, 125d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland * See the License for the specific language governing permissions and 145d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland * limitations under the License. 155d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland */ 165d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland 175d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland#define LOG_TAG "ServiceManagement" 185d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland 199a22d1db4dca94f205e25105a3d822dd179d3b53Yifan Hong#include <condition_variable> 209a22d1db4dca94f205e25105a3d822dd179d3b53Yifan Hong#include <dlfcn.h> 219a22d1db4dca94f205e25105a3d822dd179d3b53Yifan Hong#include <dirent.h> 229a22d1db4dca94f205e25105a3d822dd179d3b53Yifan Hong#include <unistd.h> 239a22d1db4dca94f205e25105a3d822dd179d3b53Yifan Hong 249a22d1db4dca94f205e25105a3d822dd179d3b53Yifan Hong#include <mutex> 259a22d1db4dca94f205e25105a3d822dd179d3b53Yifan Hong#include <regex> 269a22d1db4dca94f205e25105a3d822dd179d3b53Yifan Hong 2712f04d913dae2fb287089f6db24f144731c79d9cMartijn Coenen#include <hidl/HidlBinderSupport.h> 285d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland#include <hidl/ServiceManagement.h> 295d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland#include <hidl/Static.h> 305d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland#include <hidl/Status.h> 315d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland 32337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland#include <android-base/logging.h> 33337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland#include <hidl-util/FQName.h> 340091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Moreland#include <hidl-util/StringHelper.h> 355d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland#include <hwbinder/IPCThreadState.h> 365d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland#include <hwbinder/Parcel.h> 375d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland 385d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland#include <android/hidl/manager/1.0/IServiceManager.h> 394e92599704db4a3e29d4ad4a539586b019c99dfbYifan Hong#include <android/hidl/manager/1.0/BpHwServiceManager.h> 404e92599704db4a3e29d4ad4a539586b019c99dfbYifan Hong#include <android/hidl/manager/1.0/BnHwServiceManager.h> 415d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland 429a22d1db4dca94f205e25105a3d822dd179d3b53Yifan Hong#define RE_COMPONENT "[a-zA-Z_][a-zA-Z_0-9]*" 439a22d1db4dca94f205e25105a3d822dd179d3b53Yifan Hong#define RE_PATH RE_COMPONENT "(?:[.]" RE_COMPONENT ")*" 449a22d1db4dca94f205e25105a3d822dd179d3b53Yifan Hongstatic const std::regex gLibraryFileNamePattern("(" RE_PATH "@[0-9]+[.][0-9]+)-impl(.*?).so"); 459a22d1db4dca94f205e25105a3d822dd179d3b53Yifan Hong 465d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Morelandusing android::hidl::manager::V1_0::IServiceManager; 47337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Morelandusing android::hidl::manager::V1_0::IServiceNotification; 484e92599704db4a3e29d4ad4a539586b019c99dfbYifan Hongusing android::hidl::manager::V1_0::BpHwServiceManager; 494e92599704db4a3e29d4ad4a539586b019c99dfbYifan Hongusing android::hidl::manager::V1_0::BnHwServiceManager; 505d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland 515d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Morelandnamespace android { 525d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Morelandnamespace hardware { 535d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland 545d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Morelandsp<IServiceManager> defaultServiceManager() { 555d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland 565d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland if (gDefaultServiceManager != NULL) return gDefaultServiceManager; 575d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland if (access("/dev/hwbinder", F_OK|R_OK|W_OK) != 0) { 585d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland // HwBinder not available on this device or not accessible to 595d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland // this process. 605d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland return nullptr; 615d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland } 625d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland { 635d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland AutoMutex _l(gDefaultServiceManagerLock); 645d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland while (gDefaultServiceManager == NULL) { 654e92599704db4a3e29d4ad4a539586b019c99dfbYifan Hong gDefaultServiceManager = fromBinder<IServiceManager, BpHwServiceManager, BnHwServiceManager>( 665d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland ProcessState::self()->getContextObject(NULL)); 675d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland if (gDefaultServiceManager == NULL) 685d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland sleep(1); 695d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland } 705d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland } 715d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland 725d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland return gDefaultServiceManager; 735d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland} 745d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland 750091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Morelandstd::vector<std::string> search(const std::string &path, 760091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Moreland const std::string &prefix, 770091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Moreland const std::string &suffix) { 780091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Moreland std::unique_ptr<DIR, decltype(&closedir)> dir(opendir(path.c_str()), closedir); 790091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Moreland if (!dir) return {}; 800091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Moreland 810091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Moreland std::vector<std::string> results{}; 820091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Moreland 830091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Moreland dirent* dp; 840091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Moreland while ((dp = readdir(dir.get())) != nullptr) { 850091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Moreland std::string name = dp->d_name; 860091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Moreland 870091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Moreland if (StringHelper::StartsWith(name, prefix) && 880091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Moreland StringHelper::EndsWith(name, suffix)) { 890091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Moreland results.push_back(name); 900091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Moreland } 910091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Moreland } 920091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Moreland 930091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Moreland return results; 940091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Moreland} 950091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Moreland 969a22d1db4dca94f205e25105a3d822dd179d3b53Yifan Hongbool matchPackageName(const std::string &lib, std::string *matchedName) { 979a22d1db4dca94f205e25105a3d822dd179d3b53Yifan Hong std::smatch match; 989a22d1db4dca94f205e25105a3d822dd179d3b53Yifan Hong if (std::regex_match(lib, match, gLibraryFileNamePattern)) { 999a22d1db4dca94f205e25105a3d822dd179d3b53Yifan Hong *matchedName = match.str(1) + "::I*"; 1009a22d1db4dca94f205e25105a3d822dd179d3b53Yifan Hong return true; 1019a22d1db4dca94f205e25105a3d822dd179d3b53Yifan Hong } 1029a22d1db4dca94f205e25105a3d822dd179d3b53Yifan Hong return false; 1039a22d1db4dca94f205e25105a3d822dd179d3b53Yifan Hong} 1049a22d1db4dca94f205e25105a3d822dd179d3b53Yifan Hong 1057f49f59f349b9d097c6ab533b4a20090d0bc5740Yifan Hongstatic void registerReference(const hidl_string &interfaceName, const hidl_string &instanceName) { 1067f49f59f349b9d097c6ab533b4a20090d0bc5740Yifan Hong sp<IServiceManager> binderizedManager = defaultServiceManager(); 1077f49f59f349b9d097c6ab533b4a20090d0bc5740Yifan Hong if (binderizedManager == nullptr) { 1087f49f59f349b9d097c6ab533b4a20090d0bc5740Yifan Hong LOG(WARNING) << "Could not registerReference for " 1097f49f59f349b9d097c6ab533b4a20090d0bc5740Yifan Hong << interfaceName << "/" << instanceName 1107f49f59f349b9d097c6ab533b4a20090d0bc5740Yifan Hong << ": null binderized manager."; 1117f49f59f349b9d097c6ab533b4a20090d0bc5740Yifan Hong return; 1127f49f59f349b9d097c6ab533b4a20090d0bc5740Yifan Hong } 1137f49f59f349b9d097c6ab533b4a20090d0bc5740Yifan Hong auto ret = binderizedManager->registerPassthroughClient(interfaceName, instanceName, getpid()); 1147f49f59f349b9d097c6ab533b4a20090d0bc5740Yifan Hong if (!ret.isOk()) { 1157f49f59f349b9d097c6ab533b4a20090d0bc5740Yifan Hong LOG(WARNING) << "Could not registerReference for " 1167f49f59f349b9d097c6ab533b4a20090d0bc5740Yifan Hong << interfaceName << "/" << instanceName 1177f49f59f349b9d097c6ab533b4a20090d0bc5740Yifan Hong << ": " << ret.description(); 1187f49f59f349b9d097c6ab533b4a20090d0bc5740Yifan Hong } 119e681aa5d655fcf5e2970b7fdc91f3b307ba50331Steven Moreland LOG(VERBOSE) << "Successfully registerReference for " 120e681aa5d655fcf5e2970b7fdc91f3b307ba50331Steven Moreland << interfaceName << "/" << instanceName; 1217f49f59f349b9d097c6ab533b4a20090d0bc5740Yifan Hong} 1227f49f59f349b9d097c6ab533b4a20090d0bc5740Yifan Hong 123337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Morelandstruct PassthroughServiceManager : IServiceManager { 124337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland Return<sp<IBase>> get(const hidl_string& fqName, 125337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland const hidl_string& name) override { 126348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland const FQName iface(fqName); 127337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland 128337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland if (!iface.isValid() || 129337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland !iface.isFullyQualified() || 130337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland iface.isIdentifier()) { 131337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland LOG(ERROR) << "Invalid interface name passthrough lookup: " << fqName; 132337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland return nullptr; 133337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland } 134337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland 135348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland const std::string prefix = iface.getPackageAndVersion().string() + "-impl"; 136348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland const std::string sym = "HIDL_FETCH_" + iface.name(); 137348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland 138337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland const int dlMode = RTLD_LAZY; 139337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland void *handle = nullptr; 140337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland 1410091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Moreland // TODO: lookup in VINTF instead 1420091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Moreland // TODO(b/34135607): Remove HAL_LIBRARY_PATH_SYSTEM 1430091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Moreland 144a29905cc9dcb5a1c4368b25940aafd5081d95d54Steven Moreland dlerror(); // clear 145a29905cc9dcb5a1c4368b25940aafd5081d95d54Steven Moreland 146337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland for (const std::string &path : { 147337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland HAL_LIBRARY_PATH_ODM, HAL_LIBRARY_PATH_VENDOR, HAL_LIBRARY_PATH_SYSTEM 148337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland }) { 1490091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Moreland std::vector<std::string> libs = search(path, prefix, ".so"); 1500091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Moreland 1510091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Moreland for (const std::string &lib : libs) { 152348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland const std::string fullPath = path + lib; 153348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland 154348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland handle = dlopen(fullPath.c_str(), dlMode); 155348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland if (handle == nullptr) { 156348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland const char* error = dlerror(); 157348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland LOG(ERROR) << "Failed to dlopen " << lib << ": " 158348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland << (error == nullptr ? "unknown error" : error); 159348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland continue; 1600091c09e423b0bc2ccdc6075d74f60a4ce83450dSteven Moreland } 161337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland 162348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland IBase* (*generator)(const char* name); 163348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland *(void **)(&generator) = dlsym(handle, sym.c_str()); 164348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland if(!generator) { 165348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland const char* error = dlerror(); 166348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland LOG(ERROR) << "Passthrough lookup opened " << lib 167348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland << " but could not find symbol " << sym << ": " 168348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland << (error == nullptr ? "unknown error" : error); 169348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland dlclose(handle); 170348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland continue; 171348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland } 172337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland 173348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland IBase *interface = (*generator)(name); 174337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland 175348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland if (interface == nullptr) { 176348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland dlclose(handle); 177348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland continue; // this module doesn't provide this instance name 178348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland } 1797f49f59f349b9d097c6ab533b4a20090d0bc5740Yifan Hong 180348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland registerReference(fqName, name); 1817f49f59f349b9d097c6ab533b4a20090d0bc5740Yifan Hong 182348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland return interface; 183348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland } 184f6f1b40df805f845035ba992e8d44f24ade87b9fSteven Moreland } 185f6f1b40df805f845035ba992e8d44f24ade87b9fSteven Moreland 186348802db245e7b4d30283dd69f2bbd32e0ca8a3dSteven Moreland return nullptr; 187337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland } 188337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland 18967a024919015598efa7e24f0ab3d0d9154f12523Martijn Coenen Return<bool> add(const hidl_string& /* name */, 190337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland const sp<IBase>& /* service */) override { 191337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland LOG(FATAL) << "Cannot register services with passthrough service manager."; 192337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland return false; 193337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland } 194337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland 195705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong Return<void> list(list_cb /* _hidl_cb */) override { 196705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong LOG(FATAL) << "Cannot list services with passthrough service manager."; 197337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland return Void(); 198337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland } 199337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland Return<void> listByInterface(const hidl_string& /* fqInstanceName */, 200337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland listByInterface_cb /* _hidl_cb */) override { 201337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland // TODO: add this functionality 202337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland LOG(FATAL) << "Cannot list services with passthrough service manager."; 203337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland return Void(); 204337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland } 205337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland 206337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland Return<bool> registerForNotifications(const hidl_string& /* fqName */, 207337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland const hidl_string& /* name */, 208337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland const sp<IServiceNotification>& /* callback */) override { 209337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland // This makes no sense. 210337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland LOG(FATAL) << "Cannot register for notifications with passthrough service manager."; 211337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland return false; 212337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland } 213337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland 214705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong Return<void> debugDump(debugDump_cb _hidl_cb) override { 215705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong using Arch = ::android::hidl::base::V1_0::DebugInfo::Architecture; 216705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong static std::vector<std::pair<Arch, std::vector<const char *>>> sAllPaths{ 217705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong {Arch::IS_64BIT, {HAL_LIBRARY_PATH_ODM_64BIT, 218705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong HAL_LIBRARY_PATH_VENDOR_64BIT, 219705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong HAL_LIBRARY_PATH_SYSTEM_64BIT}}, 220705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong {Arch::IS_32BIT, {HAL_LIBRARY_PATH_ODM_32BIT, 221705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong HAL_LIBRARY_PATH_VENDOR_32BIT, 222705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong HAL_LIBRARY_PATH_SYSTEM_32BIT}} 223705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong }; 224705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong std::vector<InstanceDebugInfo> vec; 225705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong for (const auto &pair : sAllPaths) { 226705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong Arch arch = pair.first; 227705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong for (const auto &path : pair.second) { 228705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong std::vector<std::string> libs = search(path, "", ".so"); 229705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong for (const std::string &lib : libs) { 230705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong std::string matchedName; 231705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong if (matchPackageName(lib, &matchedName)) { 232705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong vec.push_back({ 233705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong .interfaceName = matchedName, 234705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong .instanceName = "*", 235705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong .clientPids = {}, 236705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong .arch = arch 237705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong }); 238705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong } 239705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong } 240705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong } 241705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong } 242705e5da46d6f6fa5a2177afe460304668bd9102cYifan Hong _hidl_cb(vec); 2437f49f59f349b9d097c6ab533b4a20090d0bc5740Yifan Hong return Void(); 2447f49f59f349b9d097c6ab533b4a20090d0bc5740Yifan Hong } 2457f49f59f349b9d097c6ab533b4a20090d0bc5740Yifan Hong 2467f49f59f349b9d097c6ab533b4a20090d0bc5740Yifan Hong Return<void> registerPassthroughClient(const hidl_string &, const hidl_string &, int32_t) override { 2477f49f59f349b9d097c6ab533b4a20090d0bc5740Yifan Hong // This makes no sense. 2487f49f59f349b9d097c6ab533b4a20090d0bc5740Yifan Hong LOG(FATAL) << "Cannot call registerPassthroughClient on passthrough service manager. " 2497f49f59f349b9d097c6ab533b4a20090d0bc5740Yifan Hong << "Call it on defaultServiceManager() instead."; 2509a22d1db4dca94f205e25105a3d822dd179d3b53Yifan Hong return Void(); 2519a22d1db4dca94f205e25105a3d822dd179d3b53Yifan Hong } 2529a22d1db4dca94f205e25105a3d822dd179d3b53Yifan Hong 253337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland}; 254337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland 255337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Morelandsp<IServiceManager> getPassthroughServiceManager() { 256337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland static sp<PassthroughServiceManager> manager(new PassthroughServiceManager()); 257337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland return manager; 258337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland} 259337e6b61c4fc3a7ba76862662117c17496a1f8a2Steven Moreland 260cbefd35d5c607fa245855ce897ae08369e667222Steven Morelandnamespace details { 261cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland 262cbefd35d5c607fa245855ce897ae08369e667222Steven Morelandstruct Waiter : IServiceNotification { 263cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland Return<void> onRegistration(const hidl_string& /* fqName */, 264cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland const hidl_string& /* name */, 265cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland bool /* preexisting */) override { 266cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland std::unique_lock<std::mutex> lock(mMutex); 267cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland if (mRegistered) { 268cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland return Void(); 269cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland } 270cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland mRegistered = true; 271cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland lock.unlock(); 272cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland 273cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland mCondition.notify_one(); 274cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland return Void(); 275cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland } 276cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland 277cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland void wait() { 278cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland std::unique_lock<std::mutex> lock(mMutex); 279cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland mCondition.wait(lock, [this]{ 280cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland return mRegistered; 281cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland }); 282cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland } 283cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland 284cbefd35d5c607fa245855ce897ae08369e667222Steven Morelandprivate: 285cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland std::mutex mMutex; 286cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland std::condition_variable mCondition; 287cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland bool mRegistered = false; 288cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland}; 289cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland 290cbefd35d5c607fa245855ce897ae08369e667222Steven Morelandvoid waitForHwService( 291cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland const std::string &interface, const std::string &instanceName) { 292cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland const sp<IServiceManager> manager = defaultServiceManager(); 293cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland 294cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland if (manager == nullptr) { 295cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland LOG(ERROR) << "Could not get default service manager."; 296cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland return; 297cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland } 298cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland 299cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland sp<Waiter> waiter = new Waiter(); 300cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland Return<bool> ret = manager->registerForNotifications(interface, instanceName, waiter); 301cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland 302cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland if (!ret.isOk()) { 303cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland LOG(ERROR) << "Transport error, " << ret.description() 304cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland << ", during notification registration for " 305cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland << interface << "/" << instanceName << "."; 306cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland return; 307cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland } 308cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland 309cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland if (!ret) { 310cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland LOG(ERROR) << "Could not register for notifications for " 311cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland << interface << "/" << instanceName << "."; 312cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland return; 313cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland } 314cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland 315cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland waiter->wait(); 316cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland} 317cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland 318cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland}; // namespace details 319cbefd35d5c607fa245855ce897ae08369e667222Steven Moreland 3205d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland}; // namespace hardware 3215d5ef7fcf17889a078212fbe75ac15d72a56586cSteven Moreland}; // namespace android 322