summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Steven Moreland <smoreland@google.com> 2024-01-02 19:07:35 +0000
committer Gerrit Code Review <noreply-gerritcodereview@google.com> 2024-01-02 19:07:35 +0000
commitc2124f89bd4f4663275dc0eed0e6fefe38bd7e5f (patch)
tree4cec715bf53a2fc112dbdd10c7bec1776705fcbe
parente068703c70e1bfc5e0ba41af1f7a006daa0b82e9 (diff)
parent95ac79e9bbf1b330735a35a8d034230195215fe6 (diff)
Merge "libfakeservicemanager: no hold lock in clear" into main
-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"