From e107b8d7433f6b09e0092ced33fac06d357feff6 Mon Sep 17 00:00:00 2001 From: 30079671 Date: Thu, 11 Sep 2025 15:34:52 +0800 Subject: [PATCH] fixdlclose Signed-off-by: 30079671 --- .../include/audio_policy_manager.h | 2 ++ .../include/audio_system_manager.h | 6 ++++ .../service/src/audio_policy_manager.cpp | 34 ++++++++++++++++--- .../client/src/audio_system_manager.cpp | 5 +++ 4 files changed, 43 insertions(+), 4 deletions(-) diff --git a/frameworks/native/audiopolicy/include/audio_policy_manager.h b/frameworks/native/audiopolicy/include/audio_policy_manager.h index cf626db6cd..7af1a4d558 100644 --- a/frameworks/native/audiopolicy/include/audio_policy_manager.h +++ b/frameworks/native/audiopolicy/include/audio_policy_manager.h @@ -149,6 +149,8 @@ public: int32_t SetRingerMode(AudioRingerMode ringMode); + void CleanUpResource(); + #ifdef FEATURE_DTMF_TONE std::vector GetSupportedTones(const std::string &countryCode); diff --git a/interfaces/inner_api/native/audiomanager/include/audio_system_manager.h b/interfaces/inner_api/native/audiomanager/include/audio_system_manager.h index 0249677376..555e8b27d4 100644 --- a/interfaces/inner_api/native/audiomanager/include/audio_system_manager.h +++ b/interfaces/inner_api/native/audiomanager/include/audio_system_manager.h @@ -1496,6 +1496,12 @@ public: * @test */ int32_t ForceVolumeKeyControlType(AudioVolumeType volumeType, int32_t duration); + + /** + * @brief clean resouce. + * @test + */ + void CleanUpResource(); class WorkgroupPrioRecorder { public: diff --git a/services/audio_policy/client/service/src/audio_policy_manager.cpp b/services/audio_policy/client/service/src/audio_policy_manager.cpp index ac9bdab7e6..95a91309d3 100644 --- a/services/audio_policy/client/service/src/audio_policy_manager.cpp +++ b/services/audio_policy/client/service/src/audio_policy_manager.cpp @@ -51,17 +51,19 @@ std::unordered_map> AudioPolicy std::weak_ptr AudioPolicyManager::audioSessionManagerCb_; std::mutex AudioPolicyManager::serverDiedSessionManagerCbkMutex_; +sptr g_deathRecipient = nullptr; static bool RegisterDeathRecipientInner(sptr object) { + CHECK_AND_RETURN_RET_LOG(object != nullptr, false, "Object is NULL."); pid_t pid = 0; pid_t uid = 0; - sptr deathRecipient = new(std::nothrow) AudioServerDeathRecipient(pid, uid); - CHECK_AND_RETURN_RET(deathRecipient != nullptr, false); - deathRecipient->SetNotifyCb( + g_deathRecipient = new(std::nothrow) AudioServerDeathRecipient(pid, uid); + CHECK_AND_RETURN_RET(g_deathRecipient != nullptr, false); + g_deathRecipient->SetNotifyCb( [] (pid_t pid, pid_t uid) { AudioPolicyManager::AudioPolicyServerDied(pid, uid); }); AUDIO_DEBUG_LOG("Register audio policy server death recipient"); - CHECK_AND_RETURN_RET_LOG(object->AddDeathRecipient(deathRecipient), false, "AddDeathRecipient failed"); + CHECK_AND_RETURN_RET_LOG(object->AddDeathRecipient(g_deathRecipient), false, "AddDeathRecipient failed"); return true; } @@ -103,6 +105,30 @@ const sptr AudioPolicyManager::GetAudioPolicyManagerProxy(bool blo return gsp; } +void AudioPolicyManager::CleanUpResource() +{ + lock_guard lock(g_apProxyMutex); + + if (g_apProxy == nullptr) { + AUDIO_INFO_LOG("g_apProxy is null."); + return; + } + + sptr object = g_apProxy->AsObject(); + if (object == nullptr) { + AUDIO_INFO_LOG("object is null."); + return; + } + + if (g_deathRecipient != nullptr) { + AUDIO_INFO_LOG("Remove DeathRecipient Success."); + object->RemoveDeathRecipient(g_deathRecipient); + g_deathRecipient = nullptr; + } + g_apProxy = nullptr; + AUDIO_INFO_LOG("Remove DeathRecipient end."); +} + static const sptr RecoverAndGetAudioPolicyManagerProxy() { AUDIO_DEBUG_LOG("In"); diff --git a/services/audio_service/client/src/audio_system_manager.cpp b/services/audio_service/client/src/audio_system_manager.cpp index 88e8697cc1..9665fd198c 100644 --- a/services/audio_service/client/src/audio_system_manager.cpp +++ b/services/audio_service/client/src/audio_system_manager.cpp @@ -2598,5 +2598,10 @@ std::shared_ptr AudioSystemManager::G } return nullptr; } + +void AudioSystemManager::CleanUpResource() +{ + AudioPolicyManager::GetInstance().CleanUpResource(); +} } // namespace AudioStandard } // namespace OHOS -- Gitee