Merge "Try fetching hwservice before waiting for it."
diff --git a/generateCpp.cpp b/generateCpp.cpp
index 2ff1c51..2f33217 100644
--- a/generateCpp.cpp
+++ b/generateCpp.cpp
@@ -243,7 +243,8 @@
// } else {
// if (vintfHwbinder) {
// while (no alive service) {
- // waitForHwService
+ // if (have already tried to get service)
+ // waitForHwService
// defaultServiceManager()->get
// }
// } else if (vintfLegacy) {
@@ -254,20 +255,16 @@
// }
// }
- out << "bool tried = false;\n";
- out.sWhile("!getStub && (vintfHwbinder || (vintfLegacy && !tried))", [&] {
-
- out.sIf("tried", [&] {
- // sleep only after the first trial.
- out << "ALOGI(\"" << functionName << ": retrying in 1s...\");\n"
- << "sleep(1);\n";
- }).endl();
-
- out << "tried = true;\n";
-
-
+ out.sFor("int tries = 0; !getStub && (vintfHwbinder || (vintfLegacy && tries == 0)); tries++", [&] {
if (!isTry) {
- out.sIf("vintfHwbinder", [&] {
+ out.sIf("tries > 1", [&] {
+ // sleep only after the first time we've called waitForHwService.
+ out << "ALOGI(\"" << functionName << ": Will do try %d for %s/%s in 1s...\", tries, "
+ << interfaceName << "::descriptor, serviceName.c_str());\n"
+ << "sleep(1);\n";
+ }).endl();
+
+ out.sIf("vintfHwbinder && tries > 0", [&] {
out << "waitForHwService("
<< interfaceName << "::descriptor, serviceName);\n";
}).endl();
@@ -287,10 +284,12 @@
out << "sp<" << gIBaseFqName.cppName() << "> base = ret;\n";
out.sIf("base == nullptr", [&] {
- // race condition. hwservicemanager drops the service
+ // if tries > 0: race condition. hwservicemanager drops the service
// from waitForHwService to here
- out << "ALOGW(\"" << interfaceName << ": found null hwbinder interface\");\n"
- << (isTry ? "break" : "continue")
+ out.sIf("tries > 0", [&] {
+ out << "ALOGW(\"" << interfaceName << ": found null hwbinder interface\");\n";
+ });
+ out << (isTry ? "break" : "continue")
<< ";\n";
}).endl();
out << "Return<sp<" << interfaceName