mediautils::SetviceSingleton : fix missing onServiceDied notification
If after the native service dies, an explicit request to get the service
happens before the death notification has been processed, the client
onServiceDied callback will never be called.
In the case of audioservice, this prevents proper reinitialization of
audio policy manager state.
Fixed by forcing an onServiceDied callback on previous service instance
in the RequestServiceManagerCallback if the new service is created with
a non null previous service instance.
Bug: 378032953
Test: kill native audioserver and monitor proper execution of audio
policy manager initialization
Flag: EXEMPT bug fix
Change-Id: Ida06566f5275587b9ce0c6cf1c18cf2a538dafbd
diff --git a/media/utils/include/mediautils/ServiceSingleton.h b/media/utils/include/mediautils/ServiceSingleton.h
index fe8e9f2..f3208cb 100644
--- a/media/utils/include/mediautils/ServiceSingleton.h
+++ b/media/utils/include/mediautils/ServiceSingleton.h
@@ -299,9 +299,15 @@
audio_utils::unique_lock ul(mMutex);
auto originalService = std::get<BaseInterfaceType<Service>>(mService);
if (originalService != service) {
+ if (originalService != nullptr) {
+ invalidateService_l<Service>();
+ }
mService = service;
mValid = true;
ul.unlock();
+ if (originalService != nullptr) {
+ traits->onServiceDied(interfaceFromBase<Service>(originalService));
+ }
traits->onNewService(service);
ul.lock();
setDeathNotifier_l<Service>(service);