ResourceManager stability improvements
link/unlink only if IResourceManagerClient != nullptr
Bug: 208191850
Change-Id: I5c84b7080e26cf1cb61591b3f9cd834147e11625
diff --git a/services/mediaresourcemanager/ResourceManagerService.cpp b/services/mediaresourcemanager/ResourceManagerService.cpp
index 1c09544..e0584df 100644
--- a/services/mediaresourcemanager/ResourceManagerService.cpp
+++ b/services/mediaresourcemanager/ResourceManagerService.cpp
@@ -483,7 +483,7 @@
}
}
if (info.cookie == 0 && client != nullptr) {
- info.cookie = addCookieAndLink_l(client->asBinder(),
+ info.cookie = addCookieAndLink_l(client,
new DeathNotifier(ref<ResourceManagerService>(), pid, clientId));
}
if (mObserverService != nullptr && !resourceAdded.empty()) {
@@ -592,7 +592,7 @@
onLastRemoved(it->second, info);
}
- removeCookieAndUnlink_l(info.client->asBinder(), info.cookie);
+ removeCookieAndUnlink_l(info.client, info.cookie);
if (mObserverService != nullptr && !info.resources.empty()) {
mObserverService->onResourceRemoved(info.uid, pid, info.resources);
@@ -812,7 +812,7 @@
return Status::fromServiceSpecificError(BAD_VALUE);
}
- uintptr_t cookie = addCookieAndLink_l(client->asBinder(),
+ uintptr_t cookie = addCookieAndLink_l(client,
new OverrideProcessInfoDeathNotifier(ref<ResourceManagerService>(), pid));
mProcessInfoOverrideMap.emplace(pid, ProcessInfoOverride{cookie, client});
@@ -820,23 +820,29 @@
return Status::ok();
}
-uintptr_t ResourceManagerService::addCookieAndLink_l(::ndk::SpAIBinder binder,
- const sp<DeathNotifier>& notifier) {
+uintptr_t ResourceManagerService::addCookieAndLink_l(
+ const std::shared_ptr<IResourceManagerClient>& client, const sp<DeathNotifier>& notifier) {
+ if (client == nullptr) {
+ return 0;
+ }
std::scoped_lock lock{sCookieLock};
uintptr_t cookie;
// Need to skip cookie 0 (if it wraps around). ResourceInfo has cookie initialized to 0
// indicating the death notifier is not created yet.
while ((cookie = ++sCookieCounter) == 0);
- AIBinder_linkToDeath(binder.get(), mDeathRecipient.get(), (void*)cookie);
+ AIBinder_linkToDeath(client->asBinder().get(), mDeathRecipient.get(), (void*)cookie);
sCookieToDeathNotifierMap.emplace(cookie, notifier);
return cookie;
}
-void ResourceManagerService::removeCookieAndUnlink_l(::ndk::SpAIBinder binder, uintptr_t cookie) {
+void ResourceManagerService::removeCookieAndUnlink_l(
+ const std::shared_ptr<IResourceManagerClient>& client, uintptr_t cookie) {
std::scoped_lock lock{sCookieLock};
- AIBinder_unlinkToDeath(binder.get(), mDeathRecipient.get(), (void*)cookie);
+ if (client != nullptr) {
+ AIBinder_unlinkToDeath(client->asBinder().get(), mDeathRecipient.get(), (void*)cookie);
+ }
sCookieToDeathNotifierMap.erase(cookie);
}
@@ -854,7 +860,7 @@
mProcessInfo->removeProcessInfoOverride(pid);
- removeCookieAndUnlink_l(it->second.client->asBinder(), it->second.cookie);
+ removeCookieAndUnlink_l(it->second.client, it->second.cookie);
mProcessInfoOverrideMap.erase(pid);
}