diff options
| author | 2024-01-02 19:07:35 +0000 | |
|---|---|---|
| committer | 2024-01-02 19:07:35 +0000 | |
| commit | c2124f89bd4f4663275dc0eed0e6fefe38bd7e5f (patch) | |
| tree | 4cec715bf53a2fc112dbdd10c7bec1776705fcbe | |
| parent | e068703c70e1bfc5e0ba41af1f7a006daa0b82e9 (diff) | |
| parent | 95ac79e9bbf1b330735a35a8d034230195215fe6 (diff) | |
Merge "libfakeservicemanager: no hold lock in clear" into main
| -rw-r--r-- | libs/fakeservicemanager/FakeServiceManager.cpp | 16 |
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" |