diff options
author | 2023-06-02 15:18:11 -0700 | |
---|---|---|
committer | 2023-06-02 17:50:22 -0700 | |
commit | 7086bcb3838b81f9290df8d766ec30316de53e59 (patch) | |
tree | 9ac8a4ccb74e84adcf1c438be6d1203fda4f3da9 | |
parent | 5302d3b013f32c1d527eeb8ae17d20821cf9aabc (diff) |
activity_manager: use waitForService instead of getService
Test: build & boot
Bug: 284487308
Change-Id: I9f81398c1350749d55e6f97e84dffbc38fcdcd62
-rw-r--r-- | libs/binder/ActivityManager.cpp | 42 |
1 files changed, 26 insertions, 16 deletions
diff --git a/libs/binder/ActivityManager.cpp b/libs/binder/ActivityManager.cpp index aca5009148..526427663b 100644 --- a/libs/binder/ActivityManager.cpp +++ b/libs/binder/ActivityManager.cpp @@ -21,6 +21,7 @@ #include <binder/ActivityManager.h> #include <binder/Binder.h> #include <binder/IServiceManager.h> +#include <binder/ProcessState.h> #include <utils/SystemClock.h> @@ -33,27 +34,36 @@ ActivityManager::ActivityManager() sp<IActivityManager> ActivityManager::getService() { std::lock_guard<Mutex> scoped_lock(mLock); - int64_t startTime = 0; sp<IActivityManager> service = mService; - while (service == nullptr || !IInterface::asBinder(service)->isBinderAlive()) { - sp<IBinder> binder = defaultServiceManager()->checkService(String16("activity")); - if (binder == nullptr) { - // Wait for the activity service to come back... - if (startTime == 0) { - startTime = uptimeMillis(); - ALOGI("Waiting for activity service"); - } else if ((uptimeMillis() - startTime) > 1000000) { - ALOGW("Waiting too long for activity service, giving up"); - service = nullptr; - break; - } - usleep(25000); - } else { + if (ProcessState::self()->isThreadPoolStarted()) { + if (service == nullptr || !IInterface::asBinder(service)->isBinderAlive()) { + sp<IBinder> binder = defaultServiceManager()->waitForService(String16("activity")); service = interface_cast<IActivityManager>(binder); mService = service; } + } else { + ALOGI("Thread pool not started. Polling for activity service."); + int64_t startTime = 0; + while (service == nullptr || !IInterface::asBinder(service)->isBinderAlive()) { + sp<IBinder> binder = defaultServiceManager()->checkService(String16("activity")); + if (binder == nullptr) { + // Wait for the activity service to come back... + if (startTime == 0) { + startTime = uptimeMillis(); + ALOGI("Waiting for activity service"); + } else if ((uptimeMillis() - startTime) > 1000000) { + ALOGW("Waiting too long for activity service, giving up"); + service = nullptr; + break; + } + usleep(25000); + } else { + service = interface_cast<IActivityManager>(binder); + mService = service; + } + } } - return service; + return mService; } int ActivityManager::openContentUri(const String16& stringUri) |