Add definition for IServiceManager 1.2
Adding a new version of IServiceManager to introduce the
following features:
- Better notifications (onRegistration will contain the interface)
- Remove service (for b/64678982, lazy HALs)
- Callbacks to support lazy hal shutdown when there are no clients (b/79983843)
- Method to list interfaces in the manifest (for b/76108617, since if they are
lazy, they will no longer show up in listByInterface)
- Broadcast to all HALs for systrace w/o root (b/78136428)
- Register w/o it having to call interface chain (b/36424585)
This CL intentionally does not introduce a method called
getPassthroughServiceManager1_2 since the passthrough manager
didn't even support 1.1 IServiceManager features. This may
be added in the future if we want some of the above features
in passthrough mode.
Test: (sanity) boot and check for fatal logs
Test: check for @1.2::IServiceManager in lshal
Test: hidl_test
Change-Id: Ife5a439a12e0e016c31187ac0bb62f9e4111113e
diff --git a/transport/ServiceManagement.cpp b/transport/ServiceManagement.cpp
index 8c46506..e652c66 100644
--- a/transport/ServiceManagement.cpp
+++ b/transport/ServiceManagement.cpp
@@ -41,9 +41,9 @@
#include <hwbinder/Parcel.h>
#include <vndksupport/linker.h>
-#include <android/hidl/manager/1.1/IServiceManager.h>
-#include <android/hidl/manager/1.1/BpHwServiceManager.h>
-#include <android/hidl/manager/1.1/BnHwServiceManager.h>
+#include <android/hidl/manager/1.2/BnHwServiceManager.h>
+#include <android/hidl/manager/1.2/BpHwServiceManager.h>
+#include <android/hidl/manager/1.2/IServiceManager.h>
#define RE_COMPONENT "[a-zA-Z_][a-zA-Z_0-9]*"
#define RE_PATH RE_COMPONENT "(?:[.]" RE_COMPONENT ")*"
@@ -53,18 +53,12 @@
using IServiceManager1_0 = android::hidl::manager::V1_0::IServiceManager;
using IServiceManager1_1 = android::hidl::manager::V1_1::IServiceManager;
+using IServiceManager1_2 = android::hidl::manager::V1_2::IServiceManager;
using android::hidl::manager::V1_0::IServiceNotification;
-using android::hidl::manager::V1_1::BpHwServiceManager;
-using android::hidl::manager::V1_1::BnHwServiceManager;
namespace android {
namespace hardware {
-namespace details {
-extern Mutex gDefaultServiceManagerLock;
-extern sp<android::hidl::manager::V1_1::IServiceManager> gDefaultServiceManager;
-} // namespace details
-
static const char* kHwServicemanagerReadyProperty = "hwservicemanager.ready";
void waitForHwServiceManager() {
@@ -137,13 +131,22 @@
} // details
sp<IServiceManager1_0> defaultServiceManager() {
- return defaultServiceManager1_1();
+ return defaultServiceManager1_2();
}
sp<IServiceManager1_1> defaultServiceManager1_1() {
+ return defaultServiceManager1_2();
+}
+sp<IServiceManager1_2> defaultServiceManager1_2() {
+ using android::hidl::manager::V1_2::BnHwServiceManager;
+ using android::hidl::manager::V1_2::BpHwServiceManager;
+
+ static std::mutex gDefaultServiceManagerLock;
+ static sp<IServiceManager1_2> gDefaultServiceManager;
+
{
- AutoMutex _l(details::gDefaultServiceManagerLock);
- if (details::gDefaultServiceManager != nullptr) {
- return details::gDefaultServiceManager;
+ std::lock_guard<std::mutex> _l(gDefaultServiceManagerLock);
+ if (gDefaultServiceManager != nullptr) {
+ return gDefaultServiceManager;
}
if (access("/dev/hwbinder", F_OK|R_OK|W_OK) != 0) {
@@ -154,18 +157,18 @@
waitForHwServiceManager();
- while (details::gDefaultServiceManager == nullptr) {
- details::gDefaultServiceManager =
- fromBinder<IServiceManager1_1, BpHwServiceManager, BnHwServiceManager>(
- ProcessState::self()->getContextObject(nullptr));
- if (details::gDefaultServiceManager == nullptr) {
+ while (gDefaultServiceManager == nullptr) {
+ gDefaultServiceManager =
+ fromBinder<IServiceManager1_2, BpHwServiceManager, BnHwServiceManager>(
+ ProcessState::self()->getContextObject(nullptr));
+ if (gDefaultServiceManager == nullptr) {
LOG(ERROR) << "Waited for hwservicemanager, but got nullptr.";
sleep(1);
}
}
}
- return details::gDefaultServiceManager;
+ return gDefaultServiceManager;
}
std::vector<std::string> search(const std::string &path,