defaultServiceManager locks before check.
A 64-bit write may not be atomic (may not be contain in one instruction),
hence the read without the lock may be unsafe in very rare cases.
Test: pass
Test: boots
Change-Id: I8abc011c1ca039671a184afab84cf1174f38e2a8
diff --git a/transport/ServiceManagement.cpp b/transport/ServiceManagement.cpp
index 15abb92..feef01f 100644
--- a/transport/ServiceManagement.cpp
+++ b/transport/ServiceManagement.cpp
@@ -53,19 +53,23 @@
sp<IServiceManager> defaultServiceManager() {
- if (gDefaultServiceManager != NULL) return gDefaultServiceManager;
- if (access("/dev/hwbinder", F_OK|R_OK|W_OK) != 0) {
- // HwBinder not available on this device or not accessible to
- // this process.
- return nullptr;
- }
{
AutoMutex _l(gDefaultServiceManagerLock);
+ if (gDefaultServiceManager != NULL) {
+ return gDefaultServiceManager;
+ }
+ if (access("/dev/hwbinder", F_OK|R_OK|W_OK) != 0) {
+ // HwBinder not available on this device or not accessible to
+ // this process.
+ return nullptr;
+ }
while (gDefaultServiceManager == NULL) {
- gDefaultServiceManager = fromBinder<IServiceManager, BpHwServiceManager, BnHwServiceManager>(
- ProcessState::self()->getContextObject(NULL));
- if (gDefaultServiceManager == NULL)
+ gDefaultServiceManager =
+ fromBinder<IServiceManager, BpHwServiceManager, BnHwServiceManager>(
+ ProcessState::self()->getContextObject(NULL));
+ if (gDefaultServiceManager == NULL) {
sleep(1);
+ }
}
}