summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
author Steven Moreland <smoreland@google.com> 2024-01-02 20:25:13 +0000
committer Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> 2024-01-02 20:25:13 +0000
commit97b953a7a461d81da9f23a945fe73c20159a4856 (patch)
tree46813efa492dc94892b0a17574f47c352ddb2a28 /libs
parent5c803bde7e64be0cb88fcb721a4586051774da58 (diff)
parentb7c5a3365ff2a07e05218dcfac4b1f92406cd696 (diff)
Merge "libfakeservicemanager: no hold lock in clear" into main am: c2124f89bd am: b7c5a3365f
Original change: https://android-review.googlesource.com/c/platform/frameworks/native/+/2892105 Change-Id: I011f9671d103a6a02e677d69d430b4b0a2f79e50 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
Diffstat (limited to 'libs')
-rw-r--r--libs/fakeservicemanager/FakeServiceManager.cpp16
1 files changed, 13 insertions, 3 deletions
diff --git a/libs/fakeservicemanager/FakeServiceManager.cpp b/libs/fakeservicemanager/FakeServiceManager.cpp
index ae242f32a3..08f30de637 100644
--- a/libs/fakeservicemanager/FakeServiceManager.cpp
+++ b/libs/fakeservicemanager/FakeServiceManager.cpp
@@ -122,9 +122,19 @@ std::vector<IServiceManager::ServiceDebugInfo> FakeServiceManager::getServiceDeb
}
void FakeServiceManager::clear() {
- std::lock_guard<std::mutex> l(mMutex);
+ std::map<String16, sp<IBinder>> backup;
+
+ {
+ std::lock_guard<std::mutex> l(mMutex);
+ backup = mNameToService;
+ mNameToService.clear();
+ }
+
+ // destructors may access FSM, so avoid recursive lock
+ backup.clear(); // explicit
- mNameToService.clear();
+ // TODO: destructors may have added more services here - may want
+ // to check this or abort
}
} // namespace android
@@ -147,4 +157,4 @@ void clearFakeServiceManager() {
LOG_ALWAYS_FATAL_IF(gFakeServiceManager == nullptr, "Fake Service Manager is not available. Forgot to call setupFakeServiceManager?");
gFakeServiceManager->clear();
}
-} //extern "C" \ No newline at end of file
+} //extern "C"