getService: try getting service before waiting
am: 7637124c99
Change-Id: Iadac05bf2af7b7ebbc99b8b3b224eaabafc40635
diff --git a/transport/ServiceManagement.cpp b/transport/ServiceManagement.cpp
index 4023a19..01f83bd 100644
--- a/transport/ServiceManagement.cpp
+++ b/transport/ServiceManagement.cpp
@@ -703,11 +703,13 @@
const bool vintfLegacy = (transport == Transport::EMPTY);
#endif // ENFORCE_VINTF_MANIFEST
- while (!getStub && (vintfHwbinder || vintfLegacy)) {
- if (waiter == nullptr) {
+ for (int tries = 0; !getStub && (vintfHwbinder || vintfLegacy); tries++) {
+ if (waiter == nullptr && tries > 0) {
waiter = new Waiter(descriptor, instance, sm);
}
- waiter->reset(); // don't reorder this -- see comments on reset()
+ if (waiter != nullptr) {
+ waiter->reset(); // don't reorder this -- see comments on reset()
+ }
Return<sp<IBase>> ret = sm->get(descriptor, instance);
if (!ret.isOk()) {
ALOGE("getService: defaultServiceManager()->get returns %s for %s/%s.",
@@ -720,7 +722,9 @@
details::canCastInterface(base.get(), descriptor.c_str(), true /* emitError */);
if (canCastRet.isOk() && canCastRet) {
- waiter->done();
+ if (waiter != nullptr) {
+ waiter->done();
+ }
return base; // still needs to be wrapped by Bp class.
}
@@ -730,8 +734,10 @@
// In case of legacy or we were not asked to retry, don't.
if (vintfLegacy || !retry) break;
- ALOGI("getService: Trying again for %s/%s...", descriptor.c_str(), instance.c_str());
- waiter->wait();
+ if (waiter != nullptr) {
+ ALOGI("getService: Trying again for %s/%s...", descriptor.c_str(), instance.c_str());
+ waiter->wait();
+ }
}
if (waiter != nullptr) {