diff options
| author | 2023-06-22 01:22:56 +0000 | |
|---|---|---|
| committer | 2023-06-22 01:22:56 +0000 | |
| commit | 5a42361de86faba4469ecdb79d60de957403251d (patch) | |
| tree | 2ba9acb88127b58f386834481fd4e11b86b42300 | |
| parent | 0135b631e19f0dd7ec548995e0b1bf1b5ab2645f (diff) | |
| parent | 9c14937a37bebc192f32266ad6aedf80af2da226 (diff) | |
Merge "servicemanager: guaranteeClient on wait register" am: 0206fed4eb am: 89d9dc74d0 am: 9c14937a37
Original change: https://android-review.googlesource.com/c/platform/frameworks/native/+/2628342
Change-Id: I6e111a8627419abba4d1841d131dba975000c022
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
| -rw-r--r-- | cmds/servicemanager/ServiceManager.cpp | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/cmds/servicemanager/ServiceManager.cpp b/cmds/servicemanager/ServiceManager.cpp index e30cbd5a46..f6e4ec3c0d 100644 --- a/cmds/servicemanager/ServiceManager.cpp +++ b/cmds/servicemanager/ServiceManager.cpp @@ -404,14 +404,13 @@ Status ServiceManager::addService(const std::string& name, const sp<IBinder>& bi .allowIsolated = allowIsolated, .dumpPriority = dumpPriority, .hasClients = prevClients, // see b/279898063, matters if existing callbacks - .guaranteeClient = false, // handled below + .guaranteeClient = false, .ctx = ctx, }; if (auto it = mNameToRegistrationCallback.find(name); it != mNameToRegistrationCallback.end()) { - // TODO: this is only needed once - // See also getService - handles case where client never gets the service, - // we want the service to quit. + // If someone is currently waiting on the service, notify the service that + // we're waiting and flush it to the service. mNameToService[name].guaranteeClient = true; CHECK(handleServiceClientCallback(2 /* sm + transaction */, name, false)); mNameToService[name].guaranteeClient = true; @@ -724,6 +723,11 @@ Status ServiceManager::registerClientCallback(const std::string& name, const sp< mNameToClientCallback[name].push_back(cb); + // Flush updated info to client callbacks (especially if guaranteeClient + // and !hasClient, see b/285202885). We may or may not have clients at + // this point, so ignore the return value. + (void)handleServiceClientCallback(2 /* sm + transaction */, name, false); + return Status::ok(); } |